Setup

Load Packages

##Install Packages if Needed
if (!require("ggplot2")) install.packages("ggplot2")
Loading required package: ggplot2
if (!require("cowplot")) install.packages("cowplot")
Loading required package: cowplot

Attaching package: ‘cowplot’

The following object is masked from ‘package:lubridate’:

    stamp
if (!require("lubridate")) install.packages("lubridate")
if (!require("corrplot")) install.packages("corrplot")
Loading required package: corrplot
corrplot 0.92 loaded
if (!require("lme4")) install.packages("lme4")
if (!require("vegan")) install.packages("vegan")
Loading required package: vegan
Loading required package: permute
Loading required package: lattice
This is vegan 2.6-4
if (!require("DHARMa")) install.packages("DHARMa")
Loading required package: DHARMa
This is DHARMa 0.4.6. For overview type '?DHARMa'. For recent changes, type news(package = 'DHARMa')
if (!require("effectsize")) install.packages("effectsize")
Loading required package: effectsize
if (!require("emmeans")) install.packages("emmeans")
Loading required package: emmeans
if (!require("lmerTest")) install.packages("lmerTest")
if (!require("tidyr")) install.packages("tidyr")
Loading required package: tidyr

Attaching package: ‘tidyr’

The following objects are masked from ‘package:Matrix’:

    expand, pack, unpack
if (!require("dplyr")) install.packages("dplyr")
Loading required package: dplyr

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
if (!require("plotrix")) install.packages("plotrix")
Loading required package: plotrix
Warning: package ‘plotrix’ was built under R version 4.3.2
if (!require("Rmisc")) install.packages("Rmisc")
Loading required package: Rmisc
Loading required package: plyr
------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
------------------------------------------------------------------------------------------------

Attaching package: ‘plyr’

The following objects are masked from ‘package:dplyr’:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
if (!require("ggpubr")) install.packages("ggpubr")
Loading required package: ggpubr

Attaching package: ‘ggpubr’

The following object is masked from ‘package:plyr’:

    mutate

The following object is masked from ‘package:cowplot’:

    get_legend
##Load Packages
library(ggplot2) #Required for ggplots
library(cowplot) #Required for plotting panel figures
library(lubridate) #Required for date and time formatting
library(corrplot) #Required for correlation plot
library(lme4) #Required for mixed effects modeling
library(vegan) #Required for multivariate analysis PERM
library(DHARMa) #Required to check residuals of mixed effects models
library(effectsize) #Required for eta_squared effect sizes
library(emmeans) #Required for pairwise comparisons 
library(lmerTest) #Required for p values with lme4 model summaries
library(tidyr) #Required for pivot_wider function
library(dplyr) #Required for group_by function
library(plotrix) #Required for Standard error function
library(Rmisc) #Required for SummarySE function
library(ggpubr) #Required for stat brackets

Graphing Parameters

#Note: Run "Graphing Parameters" section from 01_ExperimentalSetup.Rmd file

Sample Data and Metadata

Load and Organize Data

##Growth
Length<-read.csv("Data/Length.csv", header=TRUE)
Dates<-read.csv("Data/BonaireDates.csv", header=TRUE)

##Set date variables
Dates$Date<-as.Date(Dates$Date, format='%m/%d/%Y')

##Set factor variables
Length$Site<-factor(Length$Site, levels=c("KL", "SS"))
Length$Genotype<-factor(Length$Genotype, levels=c("AC8", "AC10", "AC12"))
Length$Orig<-factor(Length$Orig, levels=c("N", "T"))
Length$Origin<-factor(Length$Origin, levels=c("Native", "Transplant"))

##Add a Sample Set Variable
Length$Set<-paste(Length$Site, Length$Genotype, Length$Orig, sep=".")
Length$Set<-factor(Length$Set)

##Add Site.Orig variable
Length$Site.Orig<-paste(Length$Site, Length$Orig, sep=".")
Length$Site.Orig<-factor(Length$Site.Orig, levels=c("KL.N", "KL.T", "SS.N", "SS.T"))


##Bleaching Metrics
#Note: Physiological metrics calculated in 02_PhysiologyMetrics.R file
Thermal<-read.csv("Outputs/ThermData.csv", header=TRUE)

##Set factor variables
Thermal$TimeP<-factor(Thermal$TimeP, levels=c("IN", "TP1", "TP2", "TP3", "TP4"))
Thermal$Site<-factor(Thermal$Site, levels=c("KL", "SS"))
Thermal$Genotype<-factor(Thermal$Genotype, levels=c("AC8", "AC10", "AC12"))
Thermal$Orig<-factor(Thermal$Orig, levels=c("N", "T"))
Thermal$Origin<-factor(Thermal$Origin, levels=c("Native", "Transplant"))

Growth

Growth Rate TP1 to TP2

Calculate Days

##Subset Dates for TP 1 and TP 2 Growth
Growth.Dates<-subset(Dates, Task=="Growth" & TimeP=="TP1" |
                       Task=="Growth" & TimeP=="TP2" )

##Convert to Wide format
Growth.Dates<-Growth.Dates %>%  pivot_wider(names_from = TimeP, values_from = Date)

##Calculate Number of Days
#TP 1 to TP2
Growth.Dates$TP1.2_days<-time_length(Growth.Dates$TP2-Growth.Dates$TP1, unit="days")

Calculate Total Linear Extension

##Merge Length Data with Growth Dates
#Merges by Site column
#Adds TP1.2_days column
Growth<-merge(Length, Growth.Dates[,c(-2)], all.x=TRUE)

##Calculate Linear Extension (cm)
Growth$Ext_cm<-Growth$TL.TP2_cm-Growth$TL.TP1_cm

##Calculate Growth Rate (cm/day)
Growth$TLE_cm.day<-Growth$Ext_cm/Growth$TP1.2_days

Data QC

##Sample Size per Set
Growth %>% 
  dplyr::group_by(Set) %>%
  dplyr::summarize(SampleSize = length(Set))

##Check for Outliers
ggplot(Growth, aes(x=Set, y=TLE_cm.day)) + 
  geom_boxplot(alpha=0.5, shape=2, outlier.shape = NA)+
  geom_jitter(shape=16, position=position_jitter(0.1))+
  theme(axis.text.x = element_text(angle = 90))

Potential outliers have been re-measured and therefore will be retained. n=10 per Site, Genotype, Origin group

Compare Growth Rate

#Check normality
hist(Growth$TLE_cm.day)

shapiro.test(Growth$TLE_cm.day)

    Shapiro-Wilk normality test

data:  Growth$TLE_cm.day
W = 0.92803, p-value = 7.262e-06
#Not normal

hist(log(Growth$TLE_cm.day+1))

shapiro.test(log(Growth$TLE_cm.day+1))

    Shapiro-Wilk normality test

data:  log(Growth$TLE_cm.day + 1)
W = 0.94335, p-value = 7.248e-05
##Still not normal

##Compare generalized linear mixed effects models
TLE.glmr.gaus<-glmer(TLE_cm.day~Origin*Site+(1|Genotype), data=Growth, family=gaussian(link="identity"))
Warning: calling glmer() with family=gaussian (identity link) as a shortcut to lmer() is deprecated; please call lmer() directly
TLE.glmr.gaus.l<-glmer(TLE_cm.day~Origin*Site+(1|Genotype), data=Growth, family=gaussian(link="log"))
TLE.glmr.gaus.i<-glmer(TLE_cm.day~Origin*Site+(1|Genotype), data=Growth, family=gaussian(link="inverse"))

TLE.glmr.gam.l<-glmer(TLE_cm.day~Origin*Site+(1|Genotype), data=Growth, family=Gamma(link="log"))
TLE.glmr.gam.i<-glmer(TLE_cm.day~Origin*Site+(1|Genotype), data=Growth, family=Gamma(link="inverse"))

TLE.glmr.inv<-glmer(TLE_cm.day~Origin*Site+(1|Genotype), data=Growth, family=inverse.gaussian(link="1/mu^2"))
boundary (singular) fit: see help('isSingular')
TLE.glmr.inv.l<-glmer(TLE_cm.day~Origin*Site+(1|Genotype), data=Growth, family=inverse.gaussian(link="log"))
TLE.glmr.inv.i<-glmer(TLE_cm.day~Origin*Site+(1|Genotype), data=Growth, family=inverse.gaussian(link="inverse"))

AIC(TLE.glmr.gaus, TLE.glmr.gaus.l, TLE.glmr.gaus.i, TLE.glmr.gam.l, TLE.glmr.gam.i, TLE.glmr.inv, TLE.glmr.inv.l, TLE.glmr.inv.i)

Gamma distribution with log-link has the lowest AIC.

##Check residuals
TLE.glmr.gam.l_res <- simulateResiduals(fittedModel = TLE.glmr.gam.l, plot = F)
plot(TLE.glmr.gam.l_res)

Compare residuals across models

##Check residuals
TLE.glmr.gaus.l_res <- simulateResiduals(fittedModel = TLE.glmr.gaus.l, plot = F)
plot(TLE.glmr.gaus.l_res)

Compare with log+1 transformed lmer model

##Model with log +1 transformation
#Function of Site and Origin, with Genotype as a Random effect
#Interaction between Site and Origin
TLE.lme<-lmer(log(TLE_cm.day+1)~Origin*Site+(1|Genotype), data=Growth)

##Check residuals
TLE.lme_res <- simulateResiduals(fittedModel = TLE.lme, plot = F)
plot(TLE.lme_res)

Better residuals with the log+1 transformed lmer model.

##Model results
summary(TLE.lme)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(TLE_cm.day + 1) ~ Origin * Site + (1 | Genotype)
   Data: Growth

REML criterion at convergence: -233.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.0026 -0.5991 -0.1118  0.5959  2.4282 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.002965 0.05445 
 Residual             0.006632 0.08144 
Number of obs: 120, groups:  Genotype, 3

Fixed effects:
                          Estimate Std. Error         df t value Pr(>|t|)   
(Intercept)               0.125179   0.034778   2.684719   3.599  0.04400 * 
OriginTransplant         -0.007538   0.021027 114.000000  -0.359  0.72063   
SiteSS                    0.062096   0.021027 114.000000   2.953  0.00382 **
OriginTransplant:SiteSS  -0.035167   0.029737 114.000000  -1.183  0.23943   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.302              
SiteSS      -0.302  0.500       
OrgnTrn:SSS  0.214 -0.707 -0.707
eta_squared(TLE.lme)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |           0.02 | [0.00, 1.00]
Site        |           0.07 | [0.01, 1.00]
Origin:Site |           0.01 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
TLE.lme_KL<-lmer(log(TLE_cm.day+1)~Origin+(1|Genotype), data=Growth[which(Growth$Site=="KL"),])
summary(TLE.lme_KL)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(TLE_cm.day + 1) ~ Origin + (1 | Genotype)
   Data: Growth[which(Growth$Site == "KL"), ]

REML criterion at convergence: -115.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.7586 -0.6776 -0.1453  0.5574  2.2922 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.001699 0.04122 
 Residual             0.006724 0.08200 
Number of obs: 60, groups:  Genotype, 3

Fixed effects:
                  Estimate Std. Error        df t value Pr(>|t|)  
(Intercept)       0.125179   0.028116  2.712715   4.452    0.026 *
OriginTransplant -0.007538   0.021173 56.000006  -0.356    0.723  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.377
eta_squared(TLE.lme_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |       2.26e-03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
TLE.lme_SS<-lmer(log(TLE_cm.day+1)~Origin+(1|Genotype), data=Growth[which(Growth$Site=="SS"),])
summary(TLE.lme_SS)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(TLE_cm.day + 1) ~ Origin + (1 | Genotype)
   Data: Growth[which(Growth$Site == "SS"), ]

REML criterion at convergence: -114.6

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.05792 -0.57732 -0.09493  0.72022  2.38351 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.004144 0.06437 
 Residual             0.006600 0.08124 
Number of obs: 60, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)  
(Intercept)       0.18727    0.04002  2.30548   4.680   0.0323 *
OriginTransplant -0.04271    0.02098 56.00000  -2.036   0.0465 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.262
eta_squared(TLE.lme_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.07 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP1.2_Growth.sum<-summarySE(Growth, measurevar="TLE_cm.day", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Growth Rate across Treatments
TP1.2_Growth.plot<-ggplot(TP1.2_Growth.sum, aes(x=Site, y=TLE_cm.day, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=TLE_cm.day-se, ymax=TLE_cm.day+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y=expression(paste('Growth Rate (cm day'^-1*")")), colour="Origin")+
  ylim(0, 0.25)+
  annotate("text", x=2, y=0.24, label="*", size=sig.sz, fontface="bold")+
  geom_bracket(xmin=1, xmax=2, y.position=0.01, label.size=levels.sz, label="**", inherit.aes = FALSE); TP1.2_Growth.plot

Average Growth Rates by Genotype

##Summary statistics by Genotype and Origin
TP1.2_Growth.sum.SS<-summarySE(subset(Growth, Site=="SS"), measurevar="TLE_cm.day", groupvars=c("Genotype", "Origin"), na.rm=TRUE)

TP1.2_Growth.sum.SS

##Calculate Percent Difference between Native and Transplant by Genotype
TP1.2_Growth.SS<-TP1.2_Growth.sum.SS[which(TP1.2_Growth.sum.SS$Origin=="Native"), c(1,4)]
names(TP1.2_Growth.SS)[2]<-paste(names(TP1.2_Growth.SS)[2], "N", sep="_")
TP1.2_Growth.SS$TLE_cm.day_T<-TP1.2_Growth.sum.SS$TLE_cm.day[which(TP1.2_Growth.sum.SS$Origin=="Transplant")]
TP1.2_Growth.SS$Perc.Inc<-((TP1.2_Growth.SS$TLE_cm.day_N-TP1.2_Growth.SS$TLE_cm.day_T)/TP1.2_Growth.SS$TLE_cm.day_T)*100

TP1.2_Growth.SS

##Mean and Standard Error
mean(TP1.2_Growth.SS$Perc.Inc)
[1] 47.19841
std.error(TP1.2_Growth.SS$Perc.Inc)
[1] 25.89777

Thermal Tolerance

Percent Retention

Subset Thermal Assay Data by Treatment

##Control
Therm_C<-subset(Thermal, Treat=="C")

##Heated
Therm_H<-subset(Thermal, Treat=="H")

Calculate Percent Retention

Calculating retention as proportion remaining relative to corresponding control levels (0-1) for each site and genotype at each timepoint.

##Calculate averages for Control Treatment for each Site, Genotype, and Timepoint 
Therm_C<-na.omit(Therm_C)
names(Therm_C)
 [1] "ID"          "RandN"       "TimeP"       "Site"        "Genotype"    "Treat"      
 [7] "Treatment"   "Orig"        "Origin"      "Set"         "Site.Orig"   "SA_cm2"     
[13] "Chl_ug.cm2"  "Sym10.6_cm2" "Fv_Fm"      
Therm_C.a<-aggregate(Therm_C[,c(13:15)], list(Therm_C$Site, Therm_C$Genotype, Therm_C$TimeP, Therm_C$Origin), mean, na.action = na.omit)
names(Therm_C.a)[1:4]<-c("Site", "Genotype", "TimeP", "Origin")
names(Therm_C.a)[5:7]<-paste(names(Therm_C.a)[5:7], "C", sep="_")

##Merge Control Averages with Heated Samples
#Merges by Site, Genotype, and Timepoint
Therm_H<-merge(Therm_H, Therm_C.a, all.x=TRUE )

##Calculate Proportion Retained for each Bleaching Metric relative to Control
Therm_H$Chl.prop<-round((Therm_H$Chl_ug.cm2/Therm_H$Chl_ug.cm2_C), 4)
Therm_H$Sym.prop<-round((Therm_H$Sym10.6_cm2/Therm_H$Sym10.6_cm2_C), 4)
Therm_H$PAM.prop<-round((Therm_H$Fv_Fm/Therm_H$Fv_Fm_C), 4)

##Set values >1 to 1
Therm_H$Chl.prop[which(Therm_H$Chl.prop>1)]<-1.0000
Therm_H$Sym.prop[which(Therm_H$Sym.prop>1)]<-1.0000
Therm_H$PAM.prop[which(Therm_H$PAM.prop>1)]<-1.0000

Initial Heat Assay

##Subset Initial Timepoint
Thermal_IN<-subset(Thermal, TimeP=="IN")
Thermal_IN$Site.Treat<-paste(Thermal_IN$Site, Thermal_IN$Treat, sep=".")
Thermal_IN$Site.Treat<-factor(Thermal_IN$Site.Treat, levels=c("KL.C", "KL.H", "SS.C", "SS.H"))


Therm_IN<-subset(Therm_H, TimeP=="IN")

Heated vs Control

Symbionts

#Check normality
hist(Thermal_IN$Sym10.6_cm2)

shapiro.test(Thermal_IN$Sym10.6_cm2)

    Shapiro-Wilk normality test

data:  Thermal_IN$Sym10.6_cm2
W = 0.90824, p-value = 0.001334
#Not normal

hist(log(Thermal_IN$Sym10.6_cm2+1))

shapiro.test(log(Thermal_IN$Sym10.6_cm2+1))

    Shapiro-Wilk normality test

data:  log(Thermal_IN$Sym10.6_cm2 + 1)
W = 0.95667, p-value = 0.07936
#Normal

##Model
#Function of Site and Treatment, with Genotype as a Random effect
Sym.lme_IN<-lmer(log(Sym10.6_cm2+1)~Site*Treatment+(1|Genotype), data=Thermal_IN)

##Check residuals
Sym.lme_res_IN <- simulateResiduals(fittedModel = Sym.lme_IN, plot = F)
plot(Sym.lme_res_IN)


##Model results
summary(Sym.lme_IN)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Sym10.6_cm2 + 1) ~ Site * Treatment + (1 | Genotype)
   Data: Thermal_IN

REML criterion at convergence: -29.3

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.79325 -0.66013  0.08255  0.57806  2.12486 

Random effects:
 Groups   Name        Variance  Std.Dev.
 Genotype (Intercept) 0.0008222 0.02867 
 Residual             0.0230525 0.15183 
Number of obs: 47, groups:  Genotype, 3

Fixed effects:
                     Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)           0.38823    0.04685 14.06727   8.286 8.77e-07 ***
SiteSS                0.19508    0.06198 41.00308   3.147  0.00307 ** 
TreatmentHeat        -0.20370    0.06340 41.10985  -3.213  0.00256 ** 
SiteSS:TreatmentHeat -0.01724    0.08867 41.05799  -0.194  0.84677    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) SiteSS TrtmnH
SiteSS      -0.661              
TreatmentHt -0.647  0.489       
StSS:TrtmnH  0.462 -0.699 -0.715
eta_squared(Sym.lme_IN)
# Effect Size for ANOVA (Type III)

Parameter      | Eta2 (partial) |       95% CI
----------------------------------------------
Site           |           0.30 | [0.12, 1.00]
Treatment      |           0.36 | [0.17, 1.00]
Site:Treatment |       9.20e-04 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
emmeans(Sym.lme_IN, pairwise ~ Site | Treatment)
$emmeans
Treatment = Control:
 Site emmean     SE   df lower.CL upper.CL
 KL    0.388 0.0469 14.1   0.2878    0.489
 SS    0.583 0.0469 14.1   0.4829    0.684

Treatment = Heat:
 Site emmean     SE   df lower.CL upper.CL
 KL    0.185 0.0488 15.6   0.0808    0.288
 SS    0.362 0.0469 14.1   0.2619    0.463

Degrees-of-freedom method: kenward-roger 
Results are given on the log(mu + 1) (not the response) scale. 
Confidence level used: 0.95 

$contrasts
Treatment = Control:
 contrast estimate     SE   df t.ratio p.value
 KL - SS    -0.195 0.0620 41.0  -3.147  0.0031

Treatment = Heat:
 contrast estimate     SE   df t.ratio p.value
 KL - SS    -0.178 0.0635 41.1  -2.801  0.0077

Note: contrasts are still on the log(mu + 1) scale 
Degrees-of-freedom method: kenward-roger 
emmeans(Sym.lme_IN, pairwise ~ Treatment | Site)
$emmeans
Site = KL:
 Treatment emmean     SE   df lower.CL upper.CL
 Control    0.388 0.0469 14.1   0.2878    0.489
 Heat       0.185 0.0488 15.6   0.0808    0.288

Site = SS:
 Treatment emmean     SE   df lower.CL upper.CL
 Control    0.583 0.0469 14.1   0.4829    0.684
 Heat       0.362 0.0469 14.1   0.2619    0.463

Degrees-of-freedom method: kenward-roger 
Results are given on the log(mu + 1) (not the response) scale. 
Confidence level used: 0.95 

$contrasts
Site = KL:
 contrast       estimate     SE   df t.ratio p.value
 Control - Heat    0.204 0.0635 41.1   3.209  0.0026

Site = SS:
 contrast       estimate     SE   df t.ratio p.value
 Control - Heat    0.221 0.0620 41.0   3.564  0.0009

Note: contrasts are still on the log(mu + 1) scale 
Degrees-of-freedom method: kenward-roger 
##Summary statistics by Site
IN_Sym.sum<-summarySE(Thermal_IN, measurevar="Sym10.6_cm2", groupvars=c("Site", "Treatment", "Site.Treat"), na.rm=TRUE)

##Plot Average Symbionts across Treatments
IN_Sym.plot<-ggplot(IN_Sym.sum, aes(x=Site.Treat, y=Sym10.6_cm2, colour=Site)) + 
  scale_colour_manual(values=Site.colors.o)+
  geom_errorbar(aes(ymin=Sym10.6_cm2-se, ymax=Sym10.6_cm2+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(aes(shape=Treatment), size=point.sz, position=position_dodge(width=0.5))+
  scale_shape_manual(values=c(1,16))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Treatment", y=expression(paste('Symbiont Density ('*10^6,'cells cm'^-2*")")), colour="Site")+
  ylim(0, 1); IN_Sym.plot

Chlorophyll

#Check normality
hist(Thermal_IN$Chl_ug.cm2)

shapiro.test(Thermal_IN$Chl_ug.cm2)

    Shapiro-Wilk normality test

data:  Thermal_IN$Chl_ug.cm2
W = 0.88059, p-value = 0.0002132
#Not normal

hist(log(Thermal_IN$Chl_ug.cm2+1))

shapiro.test(log(Thermal_IN$Chl_ug.cm2+1))

    Shapiro-Wilk normality test

data:  log(Thermal_IN$Chl_ug.cm2 + 1)
W = 0.92511, p-value = 0.005653
#Still not normal but less skewed

##Model
#Function of Site and Treatment, with Genotype as a Random effect
Chl.lme_IN<-lmer(log(Chl_ug.cm2+1)~Site*Treatment+(1|Genotype), data=Thermal_IN)

##Check residuals
Chl.lme_res_IN <- simulateResiduals(fittedModel = Chl.lme_IN, plot = F)
plot(Chl.lme_res_IN)


##Model results
summary(Chl.lme_IN)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Chl_ug.cm2 + 1) ~ Site * Treatment + (1 | Genotype)
   Data: Thermal_IN

REML criterion at convergence: -69.1

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.50589 -0.51517  0.07352  0.50169  2.35158 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.006137 0.07834 
 Residual             0.007930 0.08905 
Number of obs: 46, groups:  Genotype, 3

Fixed effects:
                     Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)           0.45648    0.05202  2.95779   8.774  0.00329 ** 
SiteSS                0.27810    0.03635 39.99255   7.650 2.38e-09 ***
TreatmentHeat        -0.37295    0.03721 40.00578 -10.024 1.80e-12 ***
SiteSS:TreatmentHeat -0.16117    0.05265 40.01278  -3.061  0.00393 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) SiteSS TrtmnH
SiteSS      -0.349              
TreatmentHt -0.341  0.489       
StSS:TrtmnH  0.241 -0.691 -0.707
eta_squared(Chl.lme_IN)
# Effect Size for ANOVA (Type III)

Parameter      | Eta2 (partial) |       95% CI
----------------------------------------------
Site           |           0.58 | [0.41, 1.00]
Treatment      |           0.88 | [0.82, 1.00]
Site:Treatment |           0.19 | [0.04, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
emmeans(Chl.lme_IN, pairwise ~ Site | Treatment)
$emmeans
Treatment = Control:
 Site emmean     SE   df lower.CL upper.CL
 KL   0.4565 0.0520 2.97   0.2899    0.623
 SS   0.7346 0.0520 2.97   0.5680    0.901

Treatment = Heat:
 Site emmean     SE   df lower.CL upper.CL
 KL   0.0835 0.0526 3.11  -0.0808    0.248
 SS   0.2005 0.0526 3.11   0.0361    0.365

Degrees-of-freedom method: kenward-roger 
Results are given on the log(mu + 1) (not the response) scale. 
Confidence level used: 0.95 

$contrasts
Treatment = Control:
 contrast estimate     SE df t.ratio p.value
 KL - SS    -0.278 0.0364 40  -7.650  <.0001

Treatment = Heat:
 contrast estimate     SE df t.ratio p.value
 KL - SS    -0.117 0.0381 40  -3.070  0.0038

Note: contrasts are still on the log(mu + 1) scale 
Degrees-of-freedom method: kenward-roger 
emmeans(Chl.lme_IN, pairwise ~ Treatment | Site)
$emmeans
Site = KL:
 Treatment emmean     SE   df lower.CL upper.CL
 Control   0.4565 0.0520 2.97   0.2899    0.623
 Heat      0.0835 0.0526 3.11  -0.0808    0.248

Site = SS:
 Treatment emmean     SE   df lower.CL upper.CL
 Control   0.7346 0.0520 2.97   0.5680    0.901
 Heat      0.2005 0.0526 3.11   0.0361    0.365

Degrees-of-freedom method: kenward-roger 
Results are given on the log(mu + 1) (not the response) scale. 
Confidence level used: 0.95 

$contrasts
Site = KL:
 contrast       estimate     SE df t.ratio p.value
 Control - Heat    0.373 0.0372 40  10.022  <.0001

Site = SS:
 contrast       estimate     SE df t.ratio p.value
 Control - Heat    0.534 0.0372 40  14.353  <.0001

Note: contrasts are still on the log(mu + 1) scale 
Degrees-of-freedom method: kenward-roger 
##Summary statistics by Site
IN_Chl.sum<-summarySE(Thermal_IN, measurevar="Chl_ug.cm2", groupvars=c("Site", "Treatment", "Site.Treat"), na.rm=TRUE)

##Plot Average Chlorophyll across Treatments
IN_Chl.plot<-ggplot(IN_Chl.sum, aes(x=Site.Treat, y=Chl_ug.cm2, colour=Site)) + 
  scale_colour_manual(values=Site.colors.o)+
  geom_errorbar(aes(ymin=Chl_ug.cm2-se, ymax=Chl_ug.cm2+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(aes(shape=Treatment), size=point.sz, position=position_dodge(width=0.5))+
  scale_shape_manual(values=c(1,16))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Treatment", y=expression(paste('Total Chlorophyll (\u03BCg cm'^-2*")")), colour="Site")+
  ylim(0, 1.25); IN_Chl.plot

FvFm

#Check normality
hist(Thermal_IN$Fv_Fm)

shapiro.test(Thermal_IN$Fv_Fm)

    Shapiro-Wilk normality test

data:  Thermal_IN$Fv_Fm
W = 0.87006, p-value = 9.097e-05
#Not normal

hist(log(Thermal_IN$Fv_Fm+1))

shapiro.test(log(Thermal_IN$Fv_Fm+1))

    Shapiro-Wilk normality test

data:  log(Thermal_IN$Fv_Fm + 1)
W = 0.85365, p-value = 3.226e-05
#Still not normal but less skewed

##Model
#Function of Site and Treatment, with Genotype as a Random effect
PAM.lme_IN<-lmer(log(Fv_Fm+1)~Site*Treatment+(1|Genotype), data=Thermal_IN)
boundary (singular) fit: see help('isSingular')
##Check residuals
PAM.lme_res_IN <- simulateResiduals(fittedModel = PAM.lme_IN, plot = F)
plot(PAM.lme_res_IN)


##Model results
summary(PAM.lme_IN)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Fv_Fm + 1) ~ Site * Treatment + (1 | Genotype)
   Data: Thermal_IN

REML criterion at convergence: -202.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.7092 -0.4159  0.1391  0.6366  1.5720 

Random effects:
 Groups   Name        Variance  Std.Dev.
 Genotype (Intercept) 0.0000000 0.00000 
 Residual             0.0004174 0.02043 
Number of obs: 47, groups:  Genotype, 3

Fixed effects:
                      Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)           0.480202   0.005897 43.000000  81.425  < 2e-16 ***
SiteSS                0.013981   0.008340 43.000000   1.676    0.101    
TreatmentHeat        -0.044190   0.008528 43.000000  -5.182 5.57e-06 ***
SiteSS:TreatmentHeat  0.022162   0.011928 43.000000   1.858    0.070 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) SiteSS TrtmnH
SiteSS      -0.707              
TreatmentHt -0.692  0.489       
StSS:TrtmnH  0.494 -0.699 -0.715
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
eta_squared(PAM.lme_IN)
# Effect Size for ANOVA (Type III)

Parameter      | Eta2 (partial) |       95% CI
----------------------------------------------
Site           |           0.29 | [0.12, 1.00]
Treatment      |           0.42 | [0.23, 1.00]
Site:Treatment |           0.07 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
emmeans(PAM.lme_IN, pairwise ~ Site | Treatment)
$emmeans
Treatment = Control:
 Site emmean      SE   df lower.CL upper.CL
 KL    0.480 0.00590 21.6    0.468    0.492
 SS    0.494 0.00590 21.6    0.482    0.506

Treatment = Heat:
 Site emmean      SE   df lower.CL upper.CL
 KL    0.436 0.00618 23.5    0.423    0.449
 SS    0.472 0.00590 21.6    0.460    0.484

Degrees-of-freedom method: kenward-roger 
Results are given on the log(mu + 1) (not the response) scale. 
Confidence level used: 0.95 

$contrasts
Treatment = Control:
 contrast estimate      SE   df t.ratio p.value
 KL - SS   -0.0140 0.00834 41.0  -1.676  0.1013

Treatment = Heat:
 contrast estimate      SE   df t.ratio p.value
 KL - SS   -0.0361 0.00855 41.2  -4.229  0.0001

Note: contrasts are still on the log(mu + 1) scale 
Degrees-of-freedom method: kenward-roger 
emmeans(PAM.lme_IN, pairwise ~ Treatment | Site)
$emmeans
Site = KL:
 Treatment emmean      SE   df lower.CL upper.CL
 Control    0.480 0.00590 21.6    0.468    0.492
 Heat       0.436 0.00618 23.5    0.423    0.449

Site = SS:
 Treatment emmean      SE   df lower.CL upper.CL
 Control    0.494 0.00590 21.6    0.482    0.506
 Heat       0.472 0.00590 21.6    0.460    0.484

Degrees-of-freedom method: kenward-roger 
Results are given on the log(mu + 1) (not the response) scale. 
Confidence level used: 0.95 

$contrasts
Site = KL:
 contrast       estimate      SE   df t.ratio p.value
 Control - Heat   0.0442 0.00855 41.2   5.171  <.0001

Site = SS:
 contrast       estimate      SE   df t.ratio p.value
 Control - Heat   0.0220 0.00834 41.0   2.641  0.0116

Note: contrasts are still on the log(mu + 1) scale 
Degrees-of-freedom method: kenward-roger 

Not normal, but model residuals are OK.

##Summary statistics by Site
IN_PAM.sum<-summarySE(Thermal_IN, measurevar="Fv_Fm", groupvars=c("Site", "Treatment", "Site.Treat"), na.rm=TRUE)

##Plot Average FvFm across Treatments
IN_PAM.plot<-ggplot(IN_PAM.sum, aes(x=Site.Treat, y=Fv_Fm, colour=Site)) + 
  scale_colour_manual(values=Site.colors.o)+
  geom_errorbar(aes(ymin=Fv_Fm-se, ymax=Fv_Fm+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(aes(shape=Treatment), size=point.sz, position=position_dodge(width=0.5))+
  scale_shape_manual(values=c(1,16))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Treatment", y="Photochemical Efficiency (Fv/Fm)", colour="Site")+
  ylim(0.5, 0.655); IN_PAM.plot

Retention by Site

Symbionts

#Check normality
hist(Therm_IN$Sym.prop)

shapiro.test(Therm_IN$Sym.prop)

    Shapiro-Wilk normality test

data:  Therm_IN$Sym.prop
W = 0.93042, p-value = 0.1117
#Normal

##Model
#Function of Site, with Genotype as a Random effect
Tol_Sym.lme_IN<-lmer(Sym.prop~Site+(1|Genotype), data=Therm_IN)

##Check residuals
Tol_Sym.lme_res_IN <- simulateResiduals(fittedModel = Tol_Sym.lme_IN, plot = F)
plot(Tol_Sym.lme_res_IN)


##Model results
summary(Tol_Sym.lme_IN)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: Sym.prop ~ Site + (1 | Genotype)
   Data: Therm_IN

REML criterion at convergence: -2.8

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.6802 -0.6578 -0.1521  0.6805  1.9852 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.07818  0.2796  
 Residual             0.03039  0.1743  
Number of obs: 23, groups:  Genotype, 3

Fixed effects:
            Estimate Std. Error       df t value Pr(>|t|)  
(Intercept)  0.46139    0.16983  2.21175   2.717   0.1014  
SiteSS       0.14316    0.07291 19.00328   1.964   0.0644 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
       (Intr)
SiteSS -0.225
eta_squared(Tol_Sym.lme_IN)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Site      |           0.17 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site
IN_TolSym.sum<-summarySE(Therm_IN, measurevar="Sym.prop", groupvars=c("Site"), na.rm=TRUE)

##Plot Average Symbiont Retention across Treatments
IN_TolSym.plot<-ggplot(IN_TolSym.sum, aes(x=Site, y=Sym.prop, colour=Site)) + 
  scale_colour_manual(values=Site.colors.o)+
  geom_errorbar(aes(ymin=Sym.prop-se, ymax=Sym.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site", y="Symbiont Retention", colour="Site")+
  ylim(0, 1)+
  annotate("text", x=1.5, y=0.75, label="-", size=sig.sz, fontface="bold"); IN_TolSym.plot

Chlorophyll

#Check normality
hist(Therm_IN$Chl.prop)

shapiro.test(Therm_IN$Chl.prop)

    Shapiro-Wilk normality test

data:  Therm_IN$Chl.prop
W = 0.98432, p-value = 0.9694
#Normal

##Model
#Function of Site, with Genotype as a Random effect
Tol_Chl.lme_IN<-lmer(Chl.prop~Site+(1|Genotype), data=Therm_IN)

##Check residuals
Tol_Chl.lme_res_IN <- simulateResiduals(fittedModel = Tol_Chl.lme_IN, plot = F)
plot(Tol_Chl.lme_res_IN)


##Model results
summary(Tol_Chl.lme_IN)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: Chl.prop ~ Site + (1 | Genotype)
   Data: Therm_IN

REML criterion at convergence: -47.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.3909 -0.5550 -0.1823  0.5284  1.9947 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.004576 0.06765 
 Residual             0.003436 0.05861 
Number of obs: 22, groups:  Genotype, 3

Fixed effects:
            Estimate Std. Error       df t value Pr(>|t|)  
(Intercept)  0.16552    0.04290  2.40867   3.858    0.045 *
SiteSS       0.04306    0.02514 18.06310   1.713    0.104  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
       (Intr)
SiteSS -0.293
eta_squared(Tol_Chl.lme_IN)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Site      |           0.14 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
IN_TolChl.sum<-summarySE(Therm_IN, measurevar="Chl.prop", groupvars=c("Site"), na.rm=TRUE)

##Plot Average Chlorophyll Retention across Treatments
IN_TolChl.plot<-ggplot(IN_TolChl.sum, aes(x=Site, y=Chl.prop, colour=Site)) + 
  scale_colour_manual(values=Site.colors.o)+
  geom_errorbar(aes(ymin=Chl.prop-se, ymax=Chl.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site", y="Chlorophyll Retention", colour="Site")+
  ylim(0, 0.35); IN_TolChl.plot

FvFm

#Check normality
hist(Therm_IN$PAM.prop)

shapiro.test(Therm_IN$PAM.prop)

    Shapiro-Wilk normality test

data:  Therm_IN$PAM.prop
W = 0.8289, p-value = 0.001154
#Not normal

hist(log(Therm_IN$PAM.prop+1))

shapiro.test(log(Therm_IN$PAM.prop+1))

    Shapiro-Wilk normality test

data:  log(Therm_IN$PAM.prop + 1)
W = 0.81061, p-value = 0.0005693
##Still not normal

##Model
#Function of Site, with Genotype as a Random effect
Tol_PAM.lme_IN<-lmer(PAM.prop~Site+(1|Genotype), data=Therm_IN)

##Check residuals
Tol_PAM.lme_res_IN <- simulateResiduals(fittedModel = Tol_PAM.lme_IN, plot = F)
plot(Tol_PAM.lme_res_IN)


##Model results
summary(Tol_PAM.lme_IN)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: PAM.prop ~ Site + (1 | Genotype)
   Data: Therm_IN

REML criterion at convergence: -50.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.7860 -0.2498  0.1225  0.5362  1.4591 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.002221 0.04713 
 Residual             0.003538 0.05948 
Number of obs: 23, groups:  Genotype, 3

Fixed effects:
            Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)  0.89138    0.03262  2.77551  27.325 0.000185 ***
SiteSS       0.05230    0.02487 19.00103   2.103 0.049053 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
       (Intr)
SiteSS -0.399
eta_squared(Tol_PAM.lme_IN)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Site      |           0.19 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Not normal, but model residuals are OK.

##Summary statistics by Site and Origin
IN_TolPAM.sum<-summarySE(Therm_IN, measurevar="PAM.prop", groupvars=c("Site"), na.rm=TRUE)

##Plot Average FvFm Retention across Treatments
IN_TolPAM.plot<-ggplot(IN_TolPAM.sum, aes(x=Site, y=PAM.prop, colour=Site)) + 
  scale_colour_manual(values=Site.colors.o)+
  geom_errorbar(aes(ymin=PAM.prop-se, ymax=PAM.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site", y="Photochemical Efficiency Retention", colour="Site")+
  ylim(0.6, 1)+
  annotate("text", x=1.5, y=1, label="*", size=sig.sz, fontface="bold"); IN_TolPAM.plot

Tolerance after Transplant

TP1

##Subset Timepoint 1
Therm_TP1<-subset(Therm_H, TimeP=="TP1")

Symbionts

#Check normality
hist(Therm_TP1$Sym.prop)

shapiro.test(Therm_TP1$Sym.prop)

    Shapiro-Wilk normality test

data:  Therm_TP1$Sym.prop
W = 0.91699, p-value = 0.002332
#Not normal

hist(log(Therm_TP1$Sym.prop+1))

shapiro.test(log(Therm_TP1$Sym.prop+1))

    Shapiro-Wilk normality test

data:  log(Therm_TP1$Sym.prop + 1)
W = 0.92258, p-value = 0.003671
##Still not normal but less skewed

##Model with log +1 transformation
#Function of Site and Origin, with Genotype as a Random effect
#Interaction between Site and Origin
Tol_Sym.lme_TP1<-lmer(log(Sym.prop+1)~Origin*Site+(1|Genotype), data=Therm_TP1)

##Check residuals
Tol_Sym.lme_res_TP1 <- simulateResiduals(fittedModel = Tol_Sym.lme_TP1, plot = F)
plot(Tol_Sym.lme_res_TP1)


##Model results
summary(Tol_Sym.lme_TP1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Sym.prop + 1) ~ Origin * Site + (1 | Genotype)
   Data: Therm_TP1

REML criterion at convergence: -33.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.1715 -0.5714  0.0059  0.7146  1.9799 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.03376  0.1837  
 Residual             0.01886  0.1373  
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error       df t value Pr(>|t|)  
(Intercept)              0.27621    0.11324  2.42412   2.439   0.1128  
OriginTransplant         0.11668    0.05606 42.00000   2.081   0.0435 *
SiteSS                   0.06309    0.05606 42.00000   1.125   0.2668  
OriginTransplant:SiteSS -0.13250    0.07928 42.00000  -1.671   0.1021  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.248              
SiteSS      -0.248  0.500       
OrgnTrn:SSS  0.175 -0.707 -0.707
eta_squared(Tol_Sym.lme_TP1)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |           0.04 | [0.00, 1.00]
Site        |       1.51e-04 | [0.00, 1.00]
Origin:Site |           0.06 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Not normal, but model residuals are OK.

Effect size of Origin for each Site

##KL
Tol_Sym.lme_TP1_KL<-lmer(log(Sym.prop+1)~Origin+(1|Genotype), data=Therm_TP1[which(Therm_TP1$Site=="KL"),])
summary(Tol_Sym.lme_TP1_KL)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Sym.prop + 1) ~ Origin + (1 | Genotype)
   Data: Therm_TP1[which(Therm_TP1$Site == "KL"), ]

REML criterion at convergence: -21.7

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.22211 -0.64466  0.06469  0.75749  1.28798 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.04259  0.2064  
 Residual             0.01291  0.1136  
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)  
(Intercept)       0.27621    0.12358  2.14836   2.235   0.1461  
OriginTransplant  0.11668    0.04638 20.00000   2.516   0.0205 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.188
eta_squared(Tol_Sym.lme_TP1_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.24 | [0.02, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Tol_Sym.lme_TP1_SS<-lmer(log(Sym.prop+1)~Origin+(1|Genotype), data=Therm_TP1[which(Therm_TP1$Site=="SS"),])
summary(Tol_Sym.lme_TP1_SS)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Sym.prop + 1) ~ Origin + (1 | Genotype)
   Data: Therm_TP1[which(Therm_TP1$Site == "SS"), ]

REML criterion at convergence: -8.8

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.4670 -0.5662  0.1529  0.6190  1.4817 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.02355  0.1535  
 Residual             0.02580  0.1606  
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)  
(Intercept)       0.33930    0.10000  2.50724   3.393   0.0557 .
OriginTransplant -0.01583    0.06558 20.00000  -0.241   0.8118  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.328
eta_squared(Tol_Sym.lme_TP1_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |       2.90e-03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP1_TolSym.sum<-summarySE(Therm_TP1, measurevar="Sym.prop", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Symbiont Retention across Treatments
TP1_TolSym.plot<-ggplot(TP1_TolSym.sum, aes(x=Site, y=Sym.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Sym.prop-se, ymax=Sym.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y="Symbiont Retention", colour="Origin")+
  ylim(0, 1)+
  annotate("text", x=1, y=0.75, label="*", size=sig.sz, fontface="bold"); TP1_TolSym.plot

Chlorophyll

#Check normality
hist(Therm_TP1$Chl.prop)

shapiro.test(Therm_TP1$Chl.prop)

    Shapiro-Wilk normality test

data:  Therm_TP1$Chl.prop
W = 0.94139, p-value = 0.01836
#Not normal

hist(log(Therm_TP1$Chl.prop+1))

shapiro.test(log(Therm_TP1$Chl.prop+1))

    Shapiro-Wilk normality test

data:  log(Therm_TP1$Chl.prop + 1)
W = 0.94765, p-value = 0.03227
##Still not normal but less skewed

##Model with log +1 transformation
#Function of Site and Origin, with Genotype as a Random effect
#Interaction between Site and Origin
Tol_Chl.lme_TP1<-lmer(log(Chl.prop+1)~Origin*Site+(1|Genotype), data=Therm_TP1)

##Check residuals
Tol_Chl.lme_res_TP1 <- simulateResiduals(fittedModel = Tol_Chl.lme_TP1, plot = F)
plot(Tol_Chl.lme_res_TP1)


##Model results
summary(Tol_Chl.lme_TP1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Chl.prop + 1) ~ Origin * Site + (1 | Genotype)
   Data: Therm_TP1

REML criterion at convergence: -112.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.1439 -0.5458 -0.0382  0.6267  1.8760 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.008382 0.09155 
 Residual             0.003065 0.05537 
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error       df t value Pr(>|t|)
(Intercept)              0.13931    0.05522  2.27664   2.523    0.113
OriginTransplant         0.01521    0.02260 42.00000   0.673    0.505
SiteSS                   0.02628    0.02260 42.00000   1.163    0.251
OriginTransplant:SiteSS -0.02689    0.03197 42.00000  -0.841    0.405

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.205              
SiteSS      -0.205  0.500       
OrgnTrn:SSS  0.145 -0.707 -0.707
eta_squared(Tol_Chl.lme_TP1)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |       2.90e-04 | [0.00, 1.00]
Site        |           0.02 | [0.00, 1.00]
Origin:Site |           0.02 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
Tol_Chl.lme_TP1_KL<-lmer(log(Chl.prop+1)~Origin+(1|Genotype), data=Therm_TP1[which(Therm_TP1$Site=="KL"),])
summary(Tol_Chl.lme_TP1_KL)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Chl.prop + 1) ~ Origin + (1 | Genotype)
   Data: Therm_TP1[which(Therm_TP1$Site == "KL"), ]

REML criterion at convergence: -55.4

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.04878 -0.58286  0.01887  0.57011  1.44796 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.007318 0.08555 
 Residual             0.002846 0.05334 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)
(Intercept)       0.13931    0.05173  2.18924   2.693    0.104
OriginTransplant  0.01521    0.02178 20.00000   0.698    0.493

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.210
eta_squared(Tol_Chl.lme_TP1_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.02 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Tol_Chl.lme_TP1_SS<-lmer(log(Chl.prop+1)~Origin+(1|Genotype), data=Therm_TP1[which(Therm_TP1$Site=="SS"),])
summary(Tol_Chl.lme_TP1_SS)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Chl.prop + 1) ~ Origin + (1 | Genotype)
   Data: Therm_TP1[which(Therm_TP1$Site == "SS"), ]

REML criterion at convergence: -50.8

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.43149 -0.56754 -0.06902  0.58853  1.85344 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.009135 0.09558 
 Residual             0.003511 0.05926 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)  
(Intercept)       0.16560    0.05777  2.18712   2.866   0.0931 .
OriginTransplant -0.01168    0.02419 20.00000  -0.483   0.6344  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.209
eta_squared(Tol_Chl.lme_TP1_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.01 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP1_TolChl.sum<-summarySE(Therm_TP1, measurevar="Chl.prop", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Chlorophyll Retention across Treatments
TP1_TolChl.plot<-ggplot(TP1_TolChl.sum, aes(x=Site, y=Chl.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Chl.prop-se, ymax=Chl.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y="Chlorophyll Retention", colour="Origin")+
  ylim(0, 0.35); TP1_TolChl.plot

FvFm

#Check normality
hist(Therm_TP1$PAM.prop)

shapiro.test(Therm_TP1$PAM.prop)

    Shapiro-Wilk normality test

data:  Therm_TP1$PAM.prop
W = 0.84073, p-value = 1.245e-05
#Not normal

hist(log(Therm_TP1$PAM.prop+1))

shapiro.test(log(Therm_TP1$PAM.prop+1))

    Shapiro-Wilk normality test

data:  log(Therm_TP1$PAM.prop + 1)
W = 0.82049, p-value = 3.908e-06
##Still not normal

##Model
#Function of Site and Origin, with Genotype as a Random effect
#Interaction between Site and Origin
Tol_PAM.lme_TP1<-lmer(PAM.prop~Origin*Site+(1|Genotype), data=Therm_TP1)

##Check residuals
Tol_PAM.lme_res_TP1 <- simulateResiduals(fittedModel = Tol_PAM.lme_TP1, plot = F)
plot(Tol_PAM.lme_res_TP1)


##Model results
summary(Tol_PAM.lme_TP1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: PAM.prop ~ Origin * Site + (1 | Genotype)
   Data: Therm_TP1

REML criterion at convergence: -84.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.3058 -0.3498  0.1733  0.6717  1.7818 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.002735 0.05230 
 Residual             0.006214 0.07883 
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)              0.86181    0.03781  3.74555  22.794 3.72e-05 ***
OriginTransplant         0.06813    0.03218 42.00000   2.117   0.0402 *  
SiteSS                  -0.01277    0.03218 42.00000  -0.397   0.6936    
OriginTransplant:SiteSS -0.07942    0.04551 42.00000  -1.745   0.0883 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.426              
SiteSS      -0.426  0.500       
OrgnTrn:SSS  0.301 -0.707 -0.707
eta_squared(Tol_PAM.lme_TP1)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |           0.04 | [0.00, 1.00]
Site        |           0.11 | [0.01, 1.00]
Origin:Site |           0.07 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Not normal, but model residuals are OK.

Effect size of Origin for each Site

##KL
Tol_PAM.lme_TP1_KL<-lmer(PAM.prop~Origin+(1|Genotype), data=Therm_TP1[which(Therm_TP1$Site=="KL"),])
summary(Tol_PAM.lme_TP1_KL)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: PAM.prop ~ Origin + (1 | Genotype)
   Data: Therm_TP1[which(Therm_TP1$Site == "KL"), ]

REML criterion at convergence: -57.2

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.21445 -0.36299  0.09321  0.61667  1.51097 

Random effects:
 Groups   Name        Variance  Std.Dev.
 Genotype (Intercept) 0.0009092 0.03015 
 Residual             0.0031116 0.05578 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)       0.86181    0.02371  3.34791  36.341 1.82e-05 ***
OriginTransplant  0.06813    0.02277 20.00000   2.992  0.00721 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.480
eta_squared(Tol_PAM.lme_TP1_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.31 | [0.06, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Tol_PAM.lme_TP1_SS<-lmer(PAM.prop~Origin+(1|Genotype), data=Therm_TP1[which(Therm_TP1$Site=="SS"),])
summary(Tol_PAM.lme_TP1_SS)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: PAM.prop ~ Origin + (1 | Genotype)
   Data: Therm_TP1[which(Therm_TP1$Site == "SS"), ]

REML criterion at convergence: -33.3

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.69510 -0.36658  0.09367  0.51233  1.74473 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.005306 0.07284 
 Residual             0.008775 0.09367 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)       0.84904    0.05000  2.73586  16.981 0.000746 ***
OriginTransplant -0.01128    0.03824 20.00000  -0.295 0.770994    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.382
eta_squared(Tol_PAM.lme_TP1_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |       4.33e-03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP1_TolPAM.sum<-summarySE(Therm_TP1, measurevar="PAM.prop", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average FvFm Retention across Treatments
TP1_TolPAM.plot<-ggplot(TP1_TolPAM.sum, aes(x=Site, y=PAM.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=PAM.prop-se, ymax=PAM.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y="Photochemical Efficiency Retention", colour="Origin")+
  ylim(0.6, 1)+
  annotate("text", x=1, y=1, label="**", size=sig.sz, fontface="bold"); TP1_TolPAM.plot

TP2

##Subset Timepoint 2
Therm_TP2<-subset(Therm_H, TimeP=="TP2")

Symbionts

#Check normality
hist(Therm_TP2$Sym.prop)

shapiro.test(Therm_TP2$Sym.prop)

    Shapiro-Wilk normality test

data:  Therm_TP2$Sym.prop
W = 0.89527, p-value = 0.0004439
#Not normal

hist(log(Therm_TP2$Sym.prop+1))

shapiro.test(log(Therm_TP2$Sym.prop+1))

    Shapiro-Wilk normality test

data:  log(Therm_TP2$Sym.prop + 1)
W = 0.88978, p-value = 0.000299
##Still not normal

##Model
#Function of Site and Origin, with Genotype as a Random effect
#Interaction between Site and Origin
Tol_Sym.lme_TP2<-lmer(Sym.prop~Origin*Site+(1|Genotype), data=Therm_TP2)

##Check residuals
Tol_Sym.lme_res_TP2 <- simulateResiduals(fittedModel = Tol_Sym.lme_TP2, plot = F)
plot(Tol_Sym.lme_res_TP2)


##Model results
summary(Tol_Sym.lme_TP2)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: Sym.prop ~ Origin * Site + (1 | Genotype)
   Data: Therm_TP2

REML criterion at convergence: -3.4

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.20381 -0.54227  0.01202  0.47665  2.09092 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.04681  0.2164  
 Residual             0.03767  0.1941  
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                         Estimate Std. Error        df t value Pr(>|t|)  
(Intercept)              0.805833   0.136905  2.613359   5.886   0.0142 *
OriginTransplant        -0.107900   0.079237 42.000000  -1.362   0.1805  
SiteSS                  -0.178425   0.079237 42.000000  -2.252   0.0296 *
OriginTransplant:SiteSS  0.005183   0.112058 42.000000   0.046   0.9633  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.289              
SiteSS      -0.289  0.500       
OrgnTrn:SSS  0.205 -0.707 -0.707
eta_squared(Tol_Sym.lme_TP2)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |           0.08 | [0.00, 1.00]
Site        |           0.19 | [0.04, 1.00]
Origin:Site |       5.09e-05 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Not normal, but model residuals are OK.

Effect size of Origin for each Site

##KL
Tol_Sym.lme_TP2_KL<-lmer(Sym.prop~Origin+(1|Genotype), data=Therm_TP2[which(Therm_TP2$Site=="KL"),])
summary(Tol_Sym.lme_TP2_KL)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: Sym.prop ~ Origin + (1 | Genotype)
   Data: Therm_TP2[which(Therm_TP2$Site == "KL"), ]

REML criterion at convergence: -1.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.0500 -0.8276  0.2039  0.4804  2.0614 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.04096  0.2024  
 Residual             0.03487  0.1867  
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)  
(Intercept)       0.80583    0.12868  2.40096   6.262   0.0154 *
OriginTransplant -0.10790    0.07623 20.00000  -1.415   0.1723  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.296
eta_squared(Tol_Sym.lme_TP2_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.09 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Tol_Sym.lme_TP2_SS<-lmer(Sym.prop~Origin+(1|Genotype), data=Therm_TP2[which(Therm_TP2$Site=="SS"),])
summary(Tol_Sym.lme_TP2_SS)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: Sym.prop ~ Origin + (1 | Genotype)
   Data: Therm_TP2[which(Therm_TP2$Site == "SS"), ]

REML criterion at convergence: 3.2

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.98373 -0.46709 -0.03333  0.50742  1.82777 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.04792  0.2189  
 Residual             0.04392  0.2096  
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)  
(Intercept)       0.62741    0.14011  2.42980   4.478    0.032 *
OriginTransplant -0.10272    0.08556 20.00000  -1.201    0.244  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.305
eta_squared(Tol_Sym.lme_TP2_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.07 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP2_TolSym.sum<-summarySE(Therm_TP2, measurevar="Sym.prop", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Retention across Treatments
TP2_TolSym.plot<-ggplot(TP2_TolSym.sum, aes(x=Site, y=Sym.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Sym.prop-se, ymax=Sym.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y="Symbiont Retention", colour="Origin")+
  ylim(0, 1); TP2_TolSym.plot

Chlorophyll

#Check normality
hist(Therm_TP2$Chl.prop)

shapiro.test(Therm_TP2$Chl.prop)

    Shapiro-Wilk normality test

data:  Therm_TP2$Chl.prop
W = 0.97677, p-value = 0.4523
#Normal

##Model
#Function of Site and Origin, with Genotype as a Random effect
#Interaction between Site and Origin
Tol_Chl.lme_TP2<-lmer(Chl.prop~Origin*Site+(1|Genotype), data=Therm_TP2)

##Check residuals
Tol_Chl.lme_res_TP2 <- simulateResiduals(fittedModel = Tol_Chl.lme_TP2, plot = F)
plot(Tol_Chl.lme_res_TP2)


##Model results
summary(Tol_Chl.lme_TP2)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: Chl.prop ~ Origin * Site + (1 | Genotype)
   Data: Therm_TP2

REML criterion at convergence: -81

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.0024 -0.7622 -0.1174  0.6824  2.9666 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.006146 0.07840 
 Residual             0.006538 0.08086 
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error       df t value Pr(>|t|)  
(Intercept)              0.31077    0.05093  2.81331   6.102   0.0106 *
OriginTransplant        -0.03844    0.03301 42.00000  -1.165   0.2508  
SiteSS                  -0.06514    0.03301 42.00000  -1.973   0.0550 .
OriginTransplant:SiteSS  0.06166    0.04668 42.00000   1.321   0.1937  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.324              
SiteSS      -0.324  0.500       
OrgnTrn:SSS  0.229 -0.707 -0.707
eta_squared(Tol_Chl.lme_TP2)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |       2.53e-03 | [0.00, 1.00]
Site        |           0.05 | [0.00, 1.00]
Origin:Site |           0.04 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
Tol_Chl.lme_TP2_KL<-lmer(Chl.prop~Origin+(1|Genotype), data=Therm_TP2[which(Therm_TP2$Site=="KL"),])
summary(Tol_Chl.lme_TP2_KL)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: Chl.prop ~ Origin + (1 | Genotype)
   Data: Therm_TP2[which(Therm_TP2$Site == "KL"), ]

REML criterion at convergence: -39.9

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-0.9725 -0.7459 -0.3411  0.6270  2.6035 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.006040 0.07772 
 Residual             0.006269 0.07918 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)  
(Intercept)       0.31077    0.05036  2.48246   6.171   0.0146 *
OriginTransplant -0.03844    0.03232 20.00001  -1.189   0.2483  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.321
eta_squared(Tol_Chl.lme_TP2_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.07 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Tol_Chl.lme_TP2_SS<-lmer(Chl.prop~Origin+(1|Genotype), data=Therm_TP2[which(Therm_TP2$Site=="SS"),])
summary(Tol_Chl.lme_TP2_SS)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: Chl.prop ~ Origin + (1 | Genotype)
   Data: Therm_TP2[which(Therm_TP2$Site == "SS"), ]

REML criterion at convergence: -46

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.2119 -0.6418  0.2701  0.7660  1.5135 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.009505 0.09749 
 Residual             0.004441 0.06664 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)  
(Intercept)       0.24563    0.05948  2.22611   4.129   0.0448 *
OriginTransplant  0.02322    0.02720 20.00000   0.853   0.4035  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.229
eta_squared(Tol_Chl.lme_TP2_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.04 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP2_TolChl.sum<-summarySE(Therm_TP2, measurevar="Chl.prop", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Retention across Treatments
TP2_TolChl.plot<-ggplot(TP2_TolChl.sum, aes(x=Site, y=Chl.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Chl.prop-se, ymax=Chl.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y="Chlorophyll Retention", colour="Origin")+
  ylim(0, 0.35); TP2_TolChl.plot

FvFm

#Check normality
hist(Therm_TP2$PAM.prop)

shapiro.test(Therm_TP2$PAM.prop)

    Shapiro-Wilk normality test

data:  Therm_TP2$PAM.prop
W = 0.73527, p-value = 5.896e-08
#Not normal

hist(log(Therm_TP2$PAM.prop+1))

shapiro.test(log(Therm_TP2$PAM.prop+1))

    Shapiro-Wilk normality test

data:  log(Therm_TP2$PAM.prop + 1)
W = 0.70205, p-value = 1.443e-08
##Still not normal

##Model
#Function of Site and Origin, with Genotype as a Random effect
#Interaction between Site and Origin
Tol_PAM.lme_TP2<-lmer(PAM.prop~Origin*Site+(1|Genotype), data=Therm_TP2)

##Check residuals
Tol_PAM.lme_res_TP2 <- simulateResiduals(fittedModel = Tol_PAM.lme_TP2, plot = F)
plot(Tol_PAM.lme_res_TP2)


##Model results
summary(Tol_PAM.lme_TP2)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: PAM.prop ~ Origin * Site + (1 | Genotype)
   Data: Therm_TP2

REML criterion at convergence: -102.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.8326 -0.3753 -0.0042  0.5350  1.7496 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.001675 0.04093 
 Residual             0.004192 0.06475 
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)              0.85622    0.03013  3.92146  28.419 1.09e-05 ***
OriginTransplant         0.07526    0.02643 42.00000   2.847  0.00680 ** 
SiteSS                   0.06487    0.02643 42.00000   2.454  0.01834 *  
OriginTransplant:SiteSS -0.10206    0.03738 42.00000  -2.730  0.00921 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.439              
SiteSS      -0.439  0.500       
OrgnTrn:SSS  0.310 -0.707 -0.707
eta_squared(Tol_PAM.lme_TP2)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |           0.04 | [0.00, 1.00]
Site        |           0.01 | [0.00, 1.00]
Origin:Site |           0.15 | [0.02, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Not normal, but model residuals are OK.

Effect size of Origin for each Site

##KL
Tol_PAM.lme_TP2_KL<-lmer(PAM.prop~Origin+(1|Genotype), data=Therm_TP2[which(Therm_TP2$Site=="KL"),])
summary(Tol_PAM.lme_TP2_KL)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: PAM.prop ~ Origin + (1 | Genotype)
   Data: Therm_TP2[which(Therm_TP2$Site == "KL"), ]

REML criterion at convergence: -40.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.9208 -0.4020  0.2520  0.5255  1.0060 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.003195 0.05653 
 Residual             0.006508 0.08067 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)       0.85622    0.04009  2.88245  21.356  0.00029 ***
OriginTransplant  0.07526    0.03293 19.99994   2.285  0.03336 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.411
eta_squared(Tol_PAM.lme_TP2_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.21 | [0.01, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Tol_PAM.lme_TP2_SS<-lmer(PAM.prop~Origin+(1|Genotype), data=Therm_TP2[which(Therm_TP2$Site=="SS"),])
summary(Tol_PAM.lme_TP2_SS)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: PAM.prop ~ Origin + (1 | Genotype)
   Data: Therm_TP2[which(Therm_TP2$Site == "SS"), ]

REML criterion at convergence: -71.4

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.04910 -0.74292 -0.04708  0.53594  2.26126 

Random effects:
 Groups   Name        Variance  Std.Dev.
 Genotype (Intercept) 0.0004937 0.02222 
 Residual             0.0016296 0.04037 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)       0.92109    0.01733  3.31062  53.146 5.72e-06 ***
OriginTransplant -0.02680    0.01648 20.00000  -1.626     0.12    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.475
eta_squared(Tol_PAM.lme_TP2_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.12 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP2_TolPAM.sum<-summarySE(Therm_TP2, measurevar="PAM.prop", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Retention across Treatments
TP2_TolPAM.plot<-ggplot(TP2_TolPAM.sum, aes(x=Site, y=PAM.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=PAM.prop-se, ymax=PAM.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y="Photochemical Efficiency Retention", colour="Origin")+
  ylim(0.6, 1)+
  annotate("text", x=1, y=1, label="*", size=sig.sz, fontface="bold"); TP2_TolPAM.plot

TP3

##Subset Timepoint 3
Therm_TP3<-subset(Therm_H, TimeP=="TP3")

Symbionts

#Check normality
hist(Therm_TP3$Sym.prop)

shapiro.test(Therm_TP3$Sym.prop)

    Shapiro-Wilk normality test

data:  Therm_TP3$Sym.prop
W = 0.78653, p-value = 6.531e-07
#Not normal

hist(log(Therm_TP3$Sym.prop+1))

shapiro.test(log(Therm_TP3$Sym.prop+1))

    Shapiro-Wilk normality test

data:  log(Therm_TP3$Sym.prop + 1)
W = 0.78571, p-value = 6.267e-07
##Still not normal but less skewed

##Model with log +1 transformation
#Function of Site and Origin, with Genotype as a Random effect
#Interaction between Site and Origin
Tol_Sym.lme_TP3<-lmer(log(Sym.prop+1)~Origin*Site+(1|Genotype), data=Therm_TP3)

##Check residuals
Tol_Sym.lme_res_TP3 <- simulateResiduals(fittedModel = Tol_Sym.lme_TP3, plot = F)
plot(Tol_Sym.lme_res_TP3)


##Model results
summary(Tol_Sym.lme_TP3)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Sym.prop + 1) ~ Origin * Site + (1 | Genotype)
   Data: Therm_TP3

REML criterion at convergence: -108.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.1559 -0.5389  0.3778  0.5963  1.6051 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 8.41e-05 0.00917 
 Residual             3.90e-03 0.06245 
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)              0.59780    0.01879 16.87446  31.815   <2e-16 ***
OriginTransplant         0.03978    0.02550 42.00000   1.560   0.1262    
SiteSS                   0.05892    0.02550 42.00000   2.311   0.0258 *  
OriginTransplant:SiteSS -0.03130    0.03606 42.00000  -0.868   0.3903    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.678              
SiteSS      -0.678  0.500       
OrgnTrn:SSS  0.480 -0.707 -0.707
eta_squared(Tol_Sym.lme_TP3)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |           0.04 | [0.00, 1.00]
Site        |           0.12 | [0.01, 1.00]
Origin:Site |           0.02 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Not normal, but model residuals are OK.

Effect size of Origin for each Site

##KL
Tol_Sym.lme_TP3_KL<-lmer(log(Sym.prop+1)~Origin+(1|Genotype), data=Therm_TP3[which(Therm_TP3$Site=="KL"),])
summary(Tol_Sym.lme_TP3_KL)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Sym.prop + 1) ~ Origin + (1 | Genotype)
   Data: Therm_TP3[which(Therm_TP3$Site == "KL"), ]

REML criterion at convergence: -48.9

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.66523 -0.53461  0.01898  0.71797  1.50619 

Random effects:
 Groups   Name        Variance  Std.Dev.
 Genotype (Intercept) 0.0003833 0.01958 
 Residual             0.0048325 0.06952 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)       0.59780    0.02303  5.00842  25.955 1.56e-06 ***
OriginTransplant  0.03978    0.02838 20.00000   1.402    0.176    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.616
eta_squared(Tol_Sym.lme_TP3_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.09 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Tol_Sym.lme_TP3_SS<-lmer(log(Sym.prop+1)~Origin+(1|Genotype), data=Therm_TP3[which(Therm_TP3$Site=="SS"),])
boundary (singular) fit: see help('isSingular')
summary(Tol_Sym.lme_TP3_SS)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Sym.prop + 1) ~ Origin + (1 | Genotype)
   Data: Therm_TP3[which(Therm_TP3$Site == "SS"), ]

REML criterion at convergence: -61.8

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.6314 -0.4640  0.5270  0.5670  0.6869 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.000000 0.00000 
 Residual             0.002812 0.05302 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                  Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)       0.656722   0.015307 22.000000  42.904   <2e-16 ***
OriginTransplant  0.008483   0.021647 22.000000   0.392    0.699    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.707
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
eta_squared(Tol_Sym.lme_TP3_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |       6.93e-03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP3_TolSym.sum<-summarySE(Therm_TP3, measurevar="Sym.prop", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Retention across Treatments
TP3_TolSym.plot<-ggplot(TP3_TolSym.sum, aes(x=Site, y=Sym.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Sym.prop-se, ymax=Sym.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y="Symbiont Retention", colour="Origin")+
  ylim(0, 1); TP3_TolSym.plot

Chlorophyll

#Check normality
hist(Therm_TP3$Chl.prop)

shapiro.test(Therm_TP3$Chl.prop)

    Shapiro-Wilk normality test

data:  Therm_TP3$Chl.prop
W = 0.89534, p-value = 0.0004461
#Not normal

hist(log(Therm_TP3$Chl.prop+1))

shapiro.test(log(Therm_TP3$Chl.prop+1))

    Shapiro-Wilk normality test

data:  log(Therm_TP3$Chl.prop + 1)
W = 0.9211, p-value = 0.003251
##Still not normal but less skewed

##Model with log +1 transformation
#Function of Site and Origin, with Genotype as a Random effect
#Interaction between Site and Origin
Tol_Chl.lme_TP3<-lmer(log(Chl.prop+1)~Origin*Site+(1|Genotype), data=Therm_TP3)
boundary (singular) fit: see help('isSingular')
##Check residuals
Tol_Chl.lme_res_TP3 <- simulateResiduals(fittedModel = Tol_Chl.lme_TP3, plot = F)
plot(Tol_Chl.lme_res_TP3)


##Model results
summary(Tol_Chl.lme_TP3)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Chl.prop + 1) ~ Origin * Site + (1 | Genotype)
   Data: Therm_TP3

REML criterion at convergence: -47.3

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.7095 -0.6080 -0.1405  0.4999  1.7650 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.00000  0.0000  
 Residual             0.01594  0.1262  
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)              0.43851    0.03644 44.00000  12.032 1.65e-15 ***
OriginTransplant         0.03181    0.05154 44.00000   0.617    0.540    
SiteSS                   0.03852    0.05154 44.00000   0.747    0.459    
OriginTransplant:SiteSS -0.02511    0.07289 44.00000  -0.344    0.732    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.707              
SiteSS      -0.707  0.500       
OrgnTrn:SSS  0.500 -0.707 -0.707
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
eta_squared(Tol_Chl.lme_TP3)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |       6.31e-03 | [0.00, 1.00]
Site        |           0.01 | [0.00, 1.00]
Origin:Site |       2.69e-03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Not normal, but model residuals are OK.

Effect size of Origin for each Site

##KL
Tol_Chl.lme_TP3_KL<-lmer(log(Chl.prop+1)~Origin+(1|Genotype), data=Therm_TP3[which(Therm_TP3$Site=="KL"),])
summary(Tol_Chl.lme_TP3_KL)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Chl.prop + 1) ~ Origin + (1 | Genotype)
   Data: Therm_TP3[which(Therm_TP3$Site == "KL"), ]

REML criterion at convergence: -35

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.1966 -0.5212 -0.1283  0.4729  1.9007 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.002703 0.05199 
 Residual             0.008473 0.09205 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)   
(Intercept)       0.43851    0.04009  3.25876  10.938  0.00112 **
OriginTransplant  0.03181    0.03758 20.00000   0.847  0.40725   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.469
eta_squared(Tol_Chl.lme_TP3_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Tol_Chl.lme_TP3_SS<-lmer(log(Chl.prop+1)~Origin+(1|Genotype), data=Therm_TP3[which(Therm_TP3$Site=="SS"),])
boundary (singular) fit: see help('isSingular')
summary(Tol_Chl.lme_TP3_SS)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Chl.prop + 1) ~ Origin + (1 | Genotype)
   Data: Therm_TP3[which(Therm_TP3$Site == "SS"), ]

REML criterion at convergence: -17.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.4740 -0.7462 -0.2782  0.6974  1.4761 

Random effects:
 Groups   Name        Variance  Std.Dev. 
 Genotype (Intercept) 3.210e-22 1.792e-11
 Residual             2.144e-02 1.464e-01
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                  Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)       0.477025   0.042265 22.000000  11.286 1.28e-10 ***
OriginTransplant  0.006709   0.059772 22.000000   0.112    0.912    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.707
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
eta_squared(Tol_Chl.lme_TP3_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |       5.72e-04 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP3_TolChl.sum<-summarySE(Therm_TP3, measurevar="Chl.prop", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Retention across Treatments
TP3_TolChl.plot<-ggplot(TP3_TolChl.sum, aes(x=Site, y=Chl.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Chl.prop-se, ymax=Chl.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y="Chlorophyll Retention", colour="Origin")+
  ylim(0, 1); TP3_TolChl.plot

FvFm

#Check normality
hist(Therm_TP3$PAM.prop)

shapiro.test(Therm_TP3$PAM.prop)

    Shapiro-Wilk normality test

data:  Therm_TP3$PAM.prop
W = 0.96358, p-value = 0.1408
#Normal

##Model
#Function of Site and Origin, with Genotype as a Random effect
#Interaction between Site and Origin
Tol_PAM.lme_TP3<-lmer(PAM.prop~Origin*Site+(1|Genotype), data=Therm_TP3)

##Check residuals
Tol_PAM.lme_res_TP3 <- simulateResiduals(fittedModel = Tol_PAM.lme_TP3, plot = F)
plot(Tol_PAM.lme_res_TP3)


##Model results
summary(Tol_PAM.lme_TP3)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: PAM.prop ~ Origin * Site + (1 | Genotype)
   Data: Therm_TP3

REML criterion at convergence: -172.6

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.29399 -0.71463  0.01706  0.83761  1.77082 

Random effects:
 Groups   Name        Variance  Std.Dev.
 Genotype (Intercept) 3.177e-05 0.005637
 Residual             9.061e-04 0.030101
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                         Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)              0.954325   0.009279 14.520200 102.850   <2e-16 ***
OriginTransplant         0.009025   0.012289 42.000000   0.734    0.467    
SiteSS                   0.003975   0.012289 42.000000   0.323    0.748    
OriginTransplant:SiteSS -0.019133   0.017379 42.000000  -1.101    0.277    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.662              
SiteSS      -0.662  0.500       
OrgnTrn:SSS  0.468 -0.707 -0.707
eta_squared(Tol_PAM.lme_TP3)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |       9.25e-05 | [0.00, 1.00]
Site        |       9.76e-03 | [0.00, 1.00]
Origin:Site |           0.03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
Tol_PAM.lme_TP3_KL<-lmer(PAM.prop~Origin+(1|Genotype), data=Therm_TP3[which(Therm_TP3$Site=="KL"),])
summary(Tol_PAM.lme_TP3_KL)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: PAM.prop ~ Origin + (1 | Genotype)
   Data: Therm_TP3[which(Therm_TP3$Site == "KL"), ]

REML criterion at convergence: -87.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.4364 -0.5727  0.1072  0.8113  1.2811 

Random effects:
 Groups   Name        Variance  Std.Dev.
 Genotype (Intercept) 3.996e-05 0.006322
 Residual             8.452e-04 0.029072
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                  Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)       0.954325   0.009152  5.656770  104.28 1.65e-10 ***
OriginTransplant  0.009025   0.011869 20.001145    0.76    0.456    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.648
eta_squared(Tol_PAM.lme_TP3_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Tol_PAM.lme_TP3_SS<-lmer(PAM.prop~Origin+(1|Genotype), data=Therm_TP3[which(Therm_TP3$Site=="SS"),])
boundary (singular) fit: see help('isSingular')
summary(Tol_PAM.lme_TP3_SS)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: PAM.prop ~ Origin + (1 | Genotype)
   Data: Therm_TP3[which(Therm_TP3$Site == "SS"), ]

REML criterion at convergence: -84.9

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.6542 -0.7178 -0.1194  0.6304  1.6515 

Random effects:
 Groups   Name        Variance  Std.Dev.
 Genotype (Intercept) 0.0000000 0.00000 
 Residual             0.0009841 0.03137 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                  Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)       0.958300   0.009056 22.000000 105.820   <2e-16 ***
OriginTransplant -0.010108   0.012807 22.000000  -0.789    0.438    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.707
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
eta_squared(Tol_PAM.lme_TP3_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP3_TolPAM.sum<-summarySE(Therm_TP3, measurevar="PAM.prop", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Retention across Treatments
TP3_TolPAM.plot<-ggplot(TP3_TolPAM.sum, aes(x=Site, y=PAM.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=PAM.prop-se, ymax=PAM.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y="Photochemical Efficiency Retention", colour="Origin")+
  ylim(0.7, 1); TP3_TolPAM.plot

TP4

##Subset Timepoint 4
Therm_TP4<-subset(Therm_H, TimeP=="TP4")

Symbionts

#Check normality
hist(Therm_TP4$Sym.prop)

shapiro.test(Therm_TP4$Sym.prop)

    Shapiro-Wilk normality test

data:  Therm_TP4$Sym.prop
W = 0.93453, p-value = 0.01005
#Not normal

hist(log(Therm_TP4$Sym.prop+1))

shapiro.test(log(Therm_TP4$Sym.prop+1))

    Shapiro-Wilk normality test

data:  log(Therm_TP4$Sym.prop + 1)
W = 0.95458, p-value = 0.061
#Normal

##Model with log +1 transformation
#Function of Site and Origin, with Genotype as a Random effect
#Interaction between Site and Origin
Tol_Sym.lme_TP4<-lmer(log(Sym.prop+1)~Origin*Site+(1|Genotype), data=Therm_TP4)

##Check residuals
Tol_Sym.lme_res_TP4 <- simulateResiduals(fittedModel = Tol_Sym.lme_TP4, plot = F)
plot(Tol_Sym.lme_res_TP4)


##Model results
summary(Tol_Sym.lme_TP4)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Sym.prop + 1) ~ Origin * Site + (1 | Genotype)
   Data: Therm_TP4

REML criterion at convergence: -44.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.5412 -0.7855 -0.1534  0.5518  2.2412 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.001295 0.03598 
 Residual             0.016289 0.12763 
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)              0.24607    0.04230  9.94436   5.818 0.000173 ***
OriginTransplant         0.04098    0.05210 42.00002   0.787 0.435975    
SiteSS                  -0.03092    0.05210 42.00002  -0.593 0.556032    
OriginTransplant:SiteSS -0.03256    0.07369 42.00002  -0.442 0.660816    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.616              
SiteSS      -0.616  0.500       
OrgnTrn:SSS  0.436 -0.707 -0.707
eta_squared(Tol_Sym.lme_TP4)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |           0.01 | [0.00, 1.00]
Site        |           0.04 | [0.00, 1.00]
Origin:Site |       4.63e-03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
Tol_Sym.lme_TP4_KL<-lmer(log(Sym.prop+1)~Origin+(1|Genotype), data=Therm_TP4[which(Therm_TP4$Site=="KL"),])
summary(Tol_Sym.lme_TP4_KL)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Sym.prop + 1) ~ Origin + (1 | Genotype)
   Data: Therm_TP4[which(Therm_TP4$Site == "KL"), ]

REML criterion at convergence: -26.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.3745 -0.8456  0.0271  0.5432  2.0020 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.002906 0.05391 
 Residual             0.012909 0.11362 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)   
(Intercept)       0.24607    0.04522  3.63655   5.442  0.00725 **
OriginTransplant  0.04098    0.04638 20.00000   0.884  0.38746   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.513
eta_squared(Tol_Sym.lme_TP4_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.04 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Tol_Sym.lme_TP4_SS<-lmer(log(Sym.prop+1)~Origin+(1|Genotype), data=Therm_TP4[which(Therm_TP4$Site=="SS"),])
boundary (singular) fit: see help('isSingular')
summary(Tol_Sym.lme_TP4_SS)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Sym.prop + 1) ~ Origin + (1 | Genotype)
   Data: Therm_TP4[which(Therm_TP4$Site == "SS"), ]

REML criterion at convergence: -19.3

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.19030 -0.85642 -0.01412  0.53810  2.27217 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.00000  0.0000  
 Residual             0.01944  0.1394  
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                  Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)       0.215142   0.040247 22.000000   5.346 2.29e-05 ***
OriginTransplant  0.008418   0.056918 22.000000   0.148    0.884    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.707
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
eta_squared(Tol_Sym.lme_TP4_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |       9.93e-04 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP4_TolSym.sum<-summarySE(Therm_TP4, measurevar="Sym.prop", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Retention across Treatments
TP4_TolSym.plot<-ggplot(TP4_TolSym.sum, aes(x=Site, y=Sym.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Sym.prop-se, ymax=Sym.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y="Symbiont Retention", colour="Origin")+
  ylim(0, 1); TP4_TolSym.plot

Chlorophyll

#Check normality
hist(Therm_TP4$Chl.prop)

shapiro.test(Therm_TP4$Chl.prop)

    Shapiro-Wilk normality test

data:  Therm_TP4$Chl.prop
W = 0.94204, p-value = 0.02131
#Not normal

hist(log(Therm_TP4$Chl.prop+1))

shapiro.test(log(Therm_TP4$Chl.prop+1))

    Shapiro-Wilk normality test

data:  log(Therm_TP4$Chl.prop + 1)
W = 0.9512, p-value = 0.04824
##Nearly normal

##Model with log +1 transformation
#Function of Site and Origin, with Genotype as a Random effect
#Interaction between Site and Origin
Tol_Chl.lme_TP4<-lmer(log(Chl.prop+1)~Origin*Site+(1|Genotype), data=Therm_TP4)
boundary (singular) fit: see help('isSingular')
##Check residuals
Tol_Chl.lme_res_TP4 <- simulateResiduals(fittedModel = Tol_Chl.lme_TP4, plot = F)
plot(Tol_Chl.lme_res_TP4)


##Model results
summary(Tol_Chl.lme_TP4)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Chl.prop + 1) ~ Origin * Site + (1 | Genotype)
   Data: Therm_TP4

REML criterion at convergence: -139.8

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.6397 -0.7647 -0.1492  0.5006  2.4251 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.000000 0.00000 
 Residual             0.001803 0.04246 
Number of obs: 47, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)              0.09448    0.01226 43.00000   7.707 1.24e-09 ***
OriginTransplant        -0.01266    0.01734 43.00000  -0.730    0.469    
SiteSS                  -0.02659    0.01773 43.00000  -1.500    0.141    
OriginTransplant:SiteSS  0.02939    0.02479 43.00000   1.185    0.242    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.707              
SiteSS      -0.692  0.489       
OrgnTrn:SSS  0.494 -0.699 -0.715
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
eta_squared(Tol_Chl.lme_TP4)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |       6.26e-04 | [0.00, 1.00]
Site        |           0.02 | [0.00, 1.00]
Origin:Site |           0.03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
Tol_Chl.lme_TP4_KL<-lmer(log(Chl.prop+1)~Origin+(1|Genotype), data=Therm_TP4[which(Therm_TP4$Site=="KL"),])
boundary (singular) fit: see help('isSingular')
summary(Tol_Chl.lme_TP4_KL)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Chl.prop + 1) ~ Origin + (1 | Genotype)
   Data: Therm_TP4[which(Therm_TP4$Site == "KL"), ]

REML criterion at convergence: -76.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.5133 -0.5558 -0.1258  0.5428  2.7208 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.000000 0.00000 
 Residual             0.001433 0.03785 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)       0.09448    0.01093 22.00000   8.647 1.59e-08 ***
OriginTransplant -0.01266    0.01545 22.00000  -0.819    0.421    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.707
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
eta_squared(Tol_Chl.lme_TP4_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Tol_Chl.lme_TP4_SS<-lmer(log(Chl.prop+1)~Origin+(1|Genotype), data=Therm_TP4[which(Therm_TP4$Site=="SS"),])
boundary (singular) fit: see help('isSingular')
summary(Tol_Chl.lme_TP4_SS)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: log(Chl.prop + 1) ~ Origin + (1 | Genotype)
   Data: Therm_TP4[which(Therm_TP4$Site == "SS"), ]

REML criterion at convergence: -64.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.4873 -0.7211 -0.1933  0.5918  2.1830 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.000000 0.00000 
 Residual             0.002192 0.04681 
Number of obs: 23, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)       0.06788    0.01412 21.00000   4.809 9.41e-05 ***
OriginTransplant  0.01673    0.01954 21.00000   0.856    0.402    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.722
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
eta_squared(Tol_Chl.lme_TP4_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP4_TolChl.sum<-summarySE(Therm_TP4, measurevar="Chl.prop", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Retention across Treatments
TP4_TolChl.plot<-ggplot(TP4_TolChl.sum, aes(x=Site, y=Chl.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Chl.prop-se, ymax=Chl.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y="Chlorophyll Retention", colour="Origin")+
  ylim(0, 0.35); TP4_TolChl.plot

FvFm

#Check normality
hist(Therm_TP4$PAM.prop)

shapiro.test(Therm_TP4$PAM.prop)

    Shapiro-Wilk normality test

data:  Therm_TP4$PAM.prop
W = 0.86379, p-value = 5.159e-05
#Not normal

hist(log(Therm_TP4$PAM.prop+1))

shapiro.test(log(Therm_TP4$PAM.prop+1))

    Shapiro-Wilk normality test

data:  log(Therm_TP4$PAM.prop + 1)
W = 0.84113, p-value = 1.275e-05
##Still not normal

##Model
#Function of Site and Origin, with Genotype as a Random effect
#Interaction between Site and Origin
Tol_PAM.lme_TP4<-lmer(PAM.prop~Origin*Site+(1|Genotype), data=Therm_TP4)

##Check residuals
Tol_PAM.lme_res_TP4 <- simulateResiduals(fittedModel = Tol_PAM.lme_TP4, plot = F)
plot(Tol_PAM.lme_res_TP4)


##Model results
summary(Tol_PAM.lme_TP4)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: PAM.prop ~ Origin * Site + (1 | Genotype)
   Data: Therm_TP4

REML criterion at convergence: -60.9

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.1005 -0.4066 -0.0093  0.5802  2.4408 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.01070  0.1035  
 Residual             0.01028  0.1014  
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error       df t value Pr(>|t|)   
(Intercept)              0.74804    0.06651  2.73320  11.247  0.00228 **
OriginTransplant         0.03239    0.04138 42.00000   0.783  0.43818   
SiteSS                   0.02783    0.04138 42.00000   0.672  0.50502   
OriginTransplant:SiteSS -0.05803    0.05852 42.00000  -0.991  0.32713   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.311              
SiteSS      -0.311  0.500       
OrgnTrn:SSS  0.220 -0.707 -0.707
eta_squared(Tol_PAM.lme_TP4)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |       3.17e-04 | [0.00, 1.00]
Site        |       3.92e-05 | [0.00, 1.00]
Origin:Site |           0.02 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
Tol_PAM.lme_TP4_KL<-lmer(PAM.prop~Origin+(1|Genotype), data=Therm_TP4[which(Therm_TP4$Site=="KL"),])
summary(Tol_PAM.lme_TP4_KL)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: PAM.prop ~ Origin + (1 | Genotype)
   Data: Therm_TP4[which(Therm_TP4$Site == "KL"), ]

REML criterion at convergence: -30.9

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.84954 -0.38862 -0.07926  0.54042  2.60201 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.011716 0.10824 
 Residual             0.009227 0.09606 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)   
(Intercept)       0.74804    0.06837  2.37263  10.941  0.00438 **
OriginTransplant  0.03239    0.03922 20.00001   0.826  0.41856   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.287
eta_squared(Tol_PAM.lme_TP4_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Tol_PAM.lme_TP4_SS<-lmer(PAM.prop~Origin+(1|Genotype), data=Therm_TP4[which(Therm_TP4$Site=="SS"),])
summary(Tol_PAM.lme_TP4_SS)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: PAM.prop ~ Origin + (1 | Genotype)
   Data: Therm_TP4[which(Therm_TP4$Site == "SS"), ]

REML criterion at convergence: -25.7

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.08840 -0.38585  0.06028  0.59276  2.02689 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.008458 0.09197 
 Residual             0.012219 0.11054 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error       df t value Pr(>|t|)   
(Intercept)       0.77587    0.06195  2.65242  12.524  0.00196 **
OriginTransplant -0.02563    0.04513 20.00000  -0.568  0.57634   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.364
eta_squared(Tol_PAM.lme_TP4_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.02 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP4_TolPAM.sum<-summarySE(Therm_TP4, measurevar="PAM.prop", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Retention across Treatments
TP4_TolPAM.plot<-ggplot(TP4_TolPAM.sum, aes(x=Site, y=PAM.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=PAM.prop-se, ymax=PAM.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y="Photochemical Efficiency Retention", colour="Origin")+
  ylim(0.6, 1); TP4_TolPAM.plot

Effect Size over Time

##Dataframe of effect size results
Tol.ES<-data.frame(TimeP=c(rep("TP1",6), rep("TP2",6), rep("TP3",6), rep("TP4",6)), 
                    Site=c(rep(c("KL", "SS"),12)),
                    Metric=c(rep(c("Sym.prop", "Sym.prop", "Chl.prop", "Chl.prop", "PAM.prop", "PAM.prop"),4)),
                    EtaSq=c(eta_squared(Tol_Sym.lme_TP1_KL)$Eta2_partial,
                             eta_squared(Tol_Sym.lme_TP1_SS)$Eta2_partial,
                             eta_squared(Tol_Chl.lme_TP1_KL)$Eta2_partial,
                             eta_squared(Tol_Chl.lme_TP1_SS)$Eta2_partial,
                             eta_squared(Tol_PAM.lme_TP1_KL)$Eta2_partial,
                             eta_squared(Tol_PAM.lme_TP1_SS)$Eta2_partial, 
                     eta_squared(Tol_Sym.lme_TP2_KL)$Eta2_partial,
                             eta_squared(Tol_Sym.lme_TP2_SS)$Eta2_partial,
                             eta_squared(Tol_Chl.lme_TP2_KL)$Eta2_partial,
                             eta_squared(Tol_Chl.lme_TP2_SS)$Eta2_partial,
                             eta_squared(Tol_PAM.lme_TP2_KL)$Eta2_partial,
                             eta_squared(Tol_PAM.lme_TP2_SS)$Eta2_partial,
                     eta_squared(Tol_Sym.lme_TP3_KL)$Eta2_partial,
                             eta_squared(Tol_Sym.lme_TP3_SS)$Eta2_partial,
                             eta_squared(Tol_Chl.lme_TP3_KL)$Eta2_partial,
                             eta_squared(Tol_Chl.lme_TP3_SS)$Eta2_partial,
                             eta_squared(Tol_PAM.lme_TP3_KL)$Eta2_partial,
                             eta_squared(Tol_PAM.lme_TP3_SS)$Eta2_partial,
                     eta_squared(Tol_Sym.lme_TP4_KL)$Eta2_partial,
                             eta_squared(Tol_Sym.lme_TP4_SS)$Eta2_partial,
                             eta_squared(Tol_Chl.lme_TP4_KL)$Eta2_partial,
                             eta_squared(Tol_Chl.lme_TP4_SS)$Eta2_partial,
                             eta_squared(Tol_PAM.lme_TP4_KL)$Eta2_partial,
                             eta_squared(Tol_PAM.lme_TP4_SS)$Eta2_partial),
                    Pvalue=c(summary(Tol_Sym.lme_TP1_KL)$coefficients[10],
                             summary(Tol_Sym.lme_TP1_SS)$coefficients[10],
                             summary(Tol_Chl.lme_TP1_KL)$coefficients[10],
                             summary(Tol_Chl.lme_TP1_SS)$coefficients[10],
                             summary(Tol_PAM.lme_TP1_KL)$coefficients[10],
                             summary(Tol_PAM.lme_TP1_SS)$coefficients[10], 
                     summary(Tol_Sym.lme_TP2_KL)$coefficients[10],
                             summary(Tol_Sym.lme_TP2_SS)$coefficients[10],
                             summary(Tol_Chl.lme_TP2_KL)$coefficients[10],
                             summary(Tol_Chl.lme_TP2_SS)$coefficients[10],
                             summary(Tol_PAM.lme_TP2_KL)$coefficients[10],
                             summary(Tol_PAM.lme_TP2_SS)$coefficients[10],
                     summary(Tol_Sym.lme_TP3_KL)$coefficients[10],
                             summary(Tol_Sym.lme_TP3_SS)$coefficients[10],
                             summary(Tol_Chl.lme_TP3_KL)$coefficients[10],
                             summary(Tol_Chl.lme_TP3_SS)$coefficients[10],
                             summary(Tol_PAM.lme_TP3_KL)$coefficients[10],
                             summary(Tol_PAM.lme_TP3_SS)$coefficients[10],
                     summary(Tol_Sym.lme_TP4_KL)$coefficients[10],
                             summary(Tol_Sym.lme_TP4_SS)$coefficients[10],
                             summary(Tol_Chl.lme_TP4_KL)$coefficients[10],
                             summary(Tol_Chl.lme_TP4_SS)$coefficients[10],
                             summary(Tol_PAM.lme_TP4_KL)$coefficients[10],
                             summary(Tol_PAM.lme_TP4_SS)$coefficients[10]))


Tol.ES$Sig<-ifelse(Tol.ES$Pvalue<0.001, "***", ifelse(Tol.ES$Pvalue<0.01, "**", ifelse(Tol.ES$Pvalue<0.05, "*", ifelse(Tol.ES$Pvalue<0.1, "-", NA))))

Symbionts

Tol_Sym.ES.plot<-ggplot(Tol.ES[which(Tol.ES$Metric=="Sym.prop"),], aes(x=TimeP, y=EtaSq, fill=Site))+
  geom_bar(stat="identity", position=position_dodge())+
    scale_fill_manual(values=Site.colors.o)+
theme_classic()+
  ggtitle("Symbiont Retention")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, hjust=0.5), axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
   labs(x="Time Point", y=expression(paste("Effect Size (p", eta^2, ")")), colour="Site")+
  ylim(0, 0.4)+
  geom_text(aes(label=Sig), vjust=-0.02, color="black", position=position_dodge(0.9), size=levels.sz, fontface="bold"); Tol_Sym.ES.plot

Chlorophyll

Tol_Chl.ES.plot<-ggplot(Tol.ES[which(Tol.ES$Metric=="Chl.prop"),], aes(x=TimeP, y=EtaSq, fill=Site))+
  geom_bar(stat="identity", position=position_dodge())+
    scale_fill_manual(values=Site.colors.o)+
theme_classic()+
  ggtitle("Chlorophyll Retention")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, hjust=0.5), axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
   labs(x="Time Point", y=expression(paste("Effect Size (p", eta^2, ")")), colour="Site")+
  ylim(0, 0.4)+
  geom_text(aes(label=Sig), vjust=-0.02, color="black", position=position_dodge(0.9), size=levels.sz, fontface="bold"); Tol_Chl.ES.plot

FvFm

Tol_PAM.ES.plot<-ggplot(Tol.ES[which(Tol.ES$Metric=="PAM.prop"),], aes(x=TimeP, y=EtaSq, fill=Site))+
  geom_bar(stat="identity", position=position_dodge())+
    scale_fill_manual(values=Site.colors.o)+
theme_classic()+
  ggtitle("Photochemical Efficiency Retention")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, hjust=0.5), axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
   labs(x="Time Point", y=expression(paste("Effect Size (p", eta^2, ")")), colour="Site")+
  ylim(0, 0.4)+
  geom_text(aes(label=Sig), vjust=-0.02, color="black", position=position_dodge(0.9), size=levels.sz, fontface="bold"); Tol_PAM.ES.plot

Trade Offs

Average Performance

Calculating the average of Growth (TP1 to TP2) and Thermal Tolerance (Retention of Symbionts, Chlorophyll, and Photochemical Efficiency at TP1) for each Set (Site, Genotype, Origin)

Growth

##Average
names(Growth)
 [1] "Site"       "ID"         "Orig"       "Origin"     "Genotype"   "TL.TP1_cm"  "TL.TP2_cm" 
 [8] "Set"        "Site.Orig"  "TP1"        "TP2"        "TP1.2_days" "Ext_cm"     "TLE_cm.day"
Growth_Set<-aggregate(Growth$TLE_cm.day, list(Growth$Site, Growth$Genotype, Growth$Orig), mean)
names(Growth_Set)<-c("Site", "Genotype", "Orig", "TLE_cm.day")

##Add Standard Error
Growth_Set$TLE_se<-aggregate(Growth$TLE_cm.day, list(Growth$Site, Growth$Genotype, Growth$Orig), std.error)[,4]

Tolerance

##Average
names(Therm_TP1)
 [1] "TimeP"         "Site"          "Genotype"      "Origin"        "ID"           
 [6] "RandN"         "Treat"         "Treatment"     "Orig"          "Set"          
[11] "Site.Orig"     "SA_cm2"        "Chl_ug.cm2"    "Sym10.6_cm2"   "Fv_Fm"        
[16] "Chl_ug.cm2_C"  "Sym10.6_cm2_C" "Fv_Fm_C"       "Chl.prop"      "Sym.prop"     
[21] "PAM.prop"     
Therm_Set<-aggregate(Therm_TP1[,c(19:21)], list(Therm_TP1$Site, Therm_TP1$Genotype, Therm_TP1$Orig), mean)
names(Therm_Set)<-c("Site", "Genotype", "Orig", "Chl.prop", "Sym.prop", "PAM.prop")

##Add Standard Error
Therm_Set$Chl_se<-aggregate(Therm_TP1$Chl.prop, list(Therm_TP1$Site, Therm_TP1$Genotype, Therm_TP1$Orig), std.error)[,4]

Therm_Set$Sym_se<-aggregate(Therm_TP1$Sym.prop, list(Therm_TP1$Site, Therm_TP1$Genotype, Therm_TP1$Orig), std.error)[,4]

Therm_Set$PAM_se<-aggregate(Therm_TP1$PAM.prop, list(Therm_TP1$Site, Therm_TP1$Genotype, Therm_TP1$Orig), std.error)[,4]

Merge Growth and Tolerance

Perf_Set<-merge(Growth_Set, Therm_Set, all=TRUE)
Perf_Set$Set<-paste(Perf_Set$Site, Perf_Set$Genotype, Perf_Set$Orig, sep=".")

##Set factor variables
Perf_Set$Site<-factor(Perf_Set$Site, levels=c("KL", "SS"))
Perf_Set$Genotype<-factor(Perf_Set$Genotype, levels=c("AC8", "AC10", "AC12"))
Perf_Set$Orig<-factor(Perf_Set$Orig, levels=c("N", "T"))

##Add a Sample Set Variable
Perf_Set$Set<-paste(Perf_Set$Site, Perf_Set$Genotype, Perf_Set$Orig, sep=".")
Perf_Set$Set<-factor(Perf_Set$Set)

##Add Site.Orig variable
Perf_Set$Site.Orig<-paste(Perf_Set$Site, Perf_Set$Orig, sep=".")
Perf_Set$Site.Orig<-factor(Perf_Set$Site.Orig, levels=c("KL.N", "KL.T", "SS.N", "SS.T"))

Correlation between Growth and Tolerance

Symbiont Retention

cor.test(Perf_Set$TLE_cm.day, Perf_Set$Sym.prop, method="spearman")

    Spearman's rank correlation rho

data:  Perf_Set$TLE_cm.day and Perf_Set$Sym.prop
S = 462, p-value = 0.03733
alternative hypothesis: true rho is not equal to 0
sample estimates:
       rho 
-0.6153846 
TLE_Sym.plot<-ggplot(Perf_Set, aes(x=TLE_cm.day, y=Sym.prop)) + 
   geom_smooth(method="lm", color="#AA185AFF", fill="#F8D7BFFF", se=TRUE)+
   geom_point(aes(colour=Site.Orig),size=point.sz)+
    scale_colour_manual(values=Orig.colors.o)+
   theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x=expression(paste('Growth Rate (cm day'^-1*")")), 
       y="Symbiont Retention", 
       colour="Site Origin")+
   annotate("text", x = 0.07, y = 0, label=expression(bolditalic(paste(r[S], " = -0.615, p = 0.037"))), size=sig.sz, hjust = 0); TLE_Sym.plot

Chlorophyll Retention

cor.test(Perf_Set$TLE_cm.day, Perf_Set$Chl.prop, method="spearman")

    Spearman's rank correlation rho

data:  Perf_Set$TLE_cm.day and Perf_Set$Chl.prop
S = 454, p-value = 0.04884
alternative hypothesis: true rho is not equal to 0
sample estimates:
       rho 
-0.5874126 
TLE_Chl.plot<-ggplot(Perf_Set, aes(x=TLE_cm.day, y=Chl.prop)) + 
   geom_smooth(method="lm", color="#AA185AFF", fill="#F8D7BFFF", se=TRUE)+
   geom_point(aes(colour=Site.Orig),size=point.sz)+
    scale_colour_manual(values=Orig.colors.o)+
   theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x=expression(paste('Growth Rate (cm day'^-1*")")), 
       y="Chlorophyll Retention", 
       colour="Site Origin")+
   annotate("text", x = 0.07, y = 0, label=expression(bolditalic(paste(r[S], " = -0.587, p = 0.049"))), size=sig.sz, hjust = 0); TLE_Chl.plot

FvFm Retention

cor.test(Perf_Set$TLE_cm.day, Perf_Set$PAM.prop, method="spearman")

    Spearman's rank correlation rho

data:  Perf_Set$TLE_cm.day and Perf_Set$PAM.prop
S = 480, p-value = 0.01883
alternative hypothesis: true rho is not equal to 0
sample estimates:
       rho 
-0.6783217 
TLE_PAM.plot<-ggplot(Perf_Set, aes(x=TLE_cm.day, y=PAM.prop)) + 
   geom_smooth(method="lm", color="#AA185AFF", fill="#F8D7BFFF", se=TRUE)+
   geom_point(aes(colour=Site.Orig),size=point.sz)+
    scale_colour_manual(values=Orig.colors.o)+
   theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x=expression(paste('Growth Rate (cm day'^-1*")")), 
       y="Photo. Effic. Retention", 
       colour="Site Origin")+
   annotate("text", x = 0.07, y = 0.74, label=expression(bolditalic(paste(r[S], " = -0.678, p = 0.019"))), size=sig.sz, hjust = 0); TLE_PAM.plot

Figures

Figure 3 Growth and Tolerance ES

Adjust Figures for Panel

##Growth
TP1.2_Growth.plot.cut<-ggplot(TP1.2_Growth.sum, aes(x=Site, y=TLE_cm.day, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=TLE_cm.day-se, ymax=TLE_cm.day+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"), legend.position=c(0.2, 0.8))+
  labs(x="Site and Origin", y=expression(paste('Growth Rate (cm day'^-1*")")), colour="Origin")+
  ylim(0, 0.3)+
    annotate("text", x=2, y=0.24, label="*", size=sig.sz, fontface="bold")+
  geom_bracket(xmin=1, xmax=2, y.position=0.01, label.size=levels.sz, label="**", inherit.aes = FALSE)

##FvFm Retention
Tol_PAM.ES.plot.cut<-ggplot(Tol.ES[which(Tol.ES$Metric=="PAM.prop"),], aes(x=TimeP, y=EtaSq, fill=Site))+
  geom_bar(stat="identity", position=position_dodge())+
  scale_fill_manual(values=Site.colors.o)+
  theme_classic()+
  ggtitle("Photochemical Efficiency")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, hjust=0.5), axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"), legend.position=c(0.8, 0.8))+
  labs(x="Time Point", y=expression(paste("Effect Size (p", eta^2, ")")), colour="Site")+
  ylim(0, 0.35)+
  geom_text(aes(label=Sig), vjust=-0.02, color="black", position=position_dodge(0.9), size=levels.sz, fontface="bold")

##Symbiont Retention
Tol_Sym.ES.plot.cut<-ggplot(Tol.ES[which(Tol.ES$Metric=="Sym.prop"),], aes(x=TimeP, y=EtaSq, fill=Site))+
  geom_bar(stat="identity", position=position_dodge())+
  scale_fill_manual(values=Site.colors.o)+
  theme_classic()+
  ggtitle("Symbionts")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, hjust=0.5), axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), legend.position="none")+
  labs(x="Time Point", y=expression(paste("Effect Size (p", eta^2, ")")), colour="Site")+
  ylim(0, 0.35)+
  geom_text(aes(label=Sig), vjust=-0.02, color="black", position=position_dodge(0.9), size=levels.sz, fontface="bold")


##Chlorophyll Retention
Tol_Chl.ES.plot.cut<-ggplot(Tol.ES[which(Tol.ES$Metric=="Chl.prop"),], aes(x=TimeP, y=EtaSq, fill=Site))+
  geom_bar(stat="identity", position=position_dodge())+
  scale_fill_manual(values=Site.colors.o)+
  theme_classic()+
  ggtitle("Chlorophyll")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, hjust=0.5), axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), legend.position="none")+
  labs(x="Time Point", y=expression(paste("Effect Size (p", eta^2, ")")), colour="Site")+
  ylim(0, 0.35)+
  geom_text(aes(label=Sig), vjust=-0.02, color="black", position=position_dodge(0.9), size=levels.sz, fontface="bold")

Figure 3

##Create Panel
Performance_fig<-plot_grid(TP1.2_Growth.plot.cut, Tol_PAM.ES.plot.cut, 
                      Tol_Sym.ES.plot.cut, Tol_Chl.ES.plot.cut,
                    rel_widths=c(1, 1, 1, 1), 
                    rel_heights = c(1, 1, 1, 1),
                    nrow=2, ncol=2, byrow=T, labels = c("A", "B", "C", "D"))
Warning: Removed 6 rows containing missing values (`geom_text()`).Warning: Removed 7 rows containing missing values (`geom_text()`).Warning: Removed 8 rows containing missing values (`geom_text()`).
##Save Figure
ggsave(filename="Figures/03_Performance/Fig3_Performance.png", plot=Performance_fig, dpi=300, width=10, height=8, units="in")

Figure 4 Growth vs Tolerance

Adjust Figures for Panel

##Growth vs FvFm Retention
TLE_PAM.plot.cut<-ggplot(Perf_Set, aes(x=TLE_cm.day, y=PAM.prop)) + 
   geom_smooth(method="lm", color="#AA185AFF", fill="#F8D7BFFF", se=TRUE)+
   geom_point(aes(colour=Site.Orig),size=point.sz)+
    scale_colour_manual(values=Orig.colors.o)+
   theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), legend.position="none")+
  labs(x=expression(paste('Growth Rate (cm day'^-1*")")), 
       y="Photo. Effic. Retention", 
       colour="Site Origin")+
   annotate("text", x = 0.07, y = 0.75, label=expression(bolditalic(paste(r[S], " = -0.678, p = 0.019"))), size=sig.sz, hjust = 0)

##Growth vs Symbiont Retention
TLE_Sym.plot.cut<-ggplot(Perf_Set, aes(x=TLE_cm.day, y=Sym.prop)) + 
   geom_smooth(method="lm", color="#AA185AFF", fill="#F8D7BFFF", se=TRUE)+
   geom_point(aes(colour=Site.Orig),size=point.sz)+
    scale_colour_manual(values=Orig.colors.o)+
   theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), legend.position="none")+
  labs(x=expression(paste('Growth Rate (cm day'^-1*")")), 
       y="Symbiont Retention", 
       colour="Site Origin")+
   annotate("text", x = 0.07, y = 0, label=expression(bolditalic(paste(r[S], " = -0.615, p = 0.037"))), size=sig.sz, hjust = 0)

Figure 4

##Create Panel
TradeOff_fig<-plot_grid(TLE_PAM.plot.cut, TLE_Sym.plot.cut, TLE_Chl.plot,
                    rel_widths=c(.75, .75, 1), 
                    rel_heights = c(1, 1, 1),
                    nrow=1, ncol=3, byrow=T, labels = c("A", "B", "C"))
`geom_smooth()` using formula = 'y ~ x'Warning: is.na() applied to non-(list or vector) of type 'expression'`geom_smooth()` using formula = 'y ~ x'Warning: is.na() applied to non-(list or vector) of type 'expression'`geom_smooth()` using formula = 'y ~ x'Warning: is.na() applied to non-(list or vector) of type 'expression'
##Save Figure
ggsave(filename="Figures/03_Performance/Fig4_TradeOff.png", plot=TradeOff_fig, dpi=300, width=12, height=4, units="in")

Figure S4 Initial Heat Assay

Adjust Figures for Panel

##FvFm
IN_PAM.plot.cut<-ggplot(IN_PAM.sum, aes(x=Site.Treat, y=Fv_Fm, colour=Site)) + 
  scale_colour_manual(values=Site.colors.o)+
  geom_errorbar(aes(ymin=Fv_Fm-se, ymax=Fv_Fm+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(aes(shape=Treatment), size=point.sz, position=position_dodge(width=0.5))+
  scale_shape_manual(values=c(1,16))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="", y="Fv/Fm", colour="Site")+
  ylim(0.5, 0.655)

IN_TolPAM.plot.cut<-ggplot(IN_TolPAM.sum, aes(x=Site, y=PAM.prop, colour=Site)) + 
  scale_colour_manual(values=Site.colors.o)+
  geom_errorbar(aes(ymin=PAM.prop-se, ymax=PAM.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="", y="Retention", colour="Site")+
  ylim(0.75, 1)+
  annotate("text", x=1.5, y=0.95, label="*", size=sig.sz, fontface="bold")

##Symbionts
IN_Sym.plot.cut<-ggplot(IN_Sym.sum, aes(x=Site.Treat, y=Sym10.6_cm2, colour=Site)) + 
  scale_colour_manual(values=Site.colors.o)+
  geom_errorbar(aes(ymin=Sym10.6_cm2-se, ymax=Sym10.6_cm2+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(aes(shape=Treatment), size=point.sz, position=position_dodge(width=0.5))+
  scale_shape_manual(values=c(1,16))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="", y=expression(paste('Symbionts ('*10^6,'cells cm'^-2*")")), colour="Site")+
  ylim(0, 1)

IN_TolSym.plot.cut<-ggplot(IN_TolSym.sum, aes(x=Site, y=Sym.prop, colour=Site)) + 
  scale_colour_manual(values=Site.colors.o)+
  geom_errorbar(aes(ymin=Sym.prop-se, ymax=Sym.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="", y="Retention", colour="Site")+
  ylim(.25, .75)+
  annotate("text", x=1.5, y=0.7, label="-", size=sig.sz, fontface="bold")

##Chlorophyll
IN_Chl.plot.cut<-ggplot(IN_Chl.sum, aes(x=Site.Treat, y=Chl_ug.cm2, colour=Site)) + 
  scale_colour_manual(values=Site.colors.o)+
  geom_errorbar(aes(ymin=Chl_ug.cm2-se, ymax=Chl_ug.cm2+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(aes(shape=Treatment), size=point.sz, position=position_dodge(width=0.5))+
  scale_shape_manual(values=c(1,16))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="Site and Treatment", y=expression(paste('Chlorophyll (\u03BCg cm'^-2*")")), colour="Site")+
  ylim(0, 1.25)

IN_TolChl.plot.cut<-ggplot(IN_TolChl.sum, aes(x=Site, y=Chl.prop, colour=Site)) + 
  scale_colour_manual(values=Site.colors.o)+
  geom_errorbar(aes(ymin=Chl.prop-se, ymax=Chl.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="Site", y="Retention", colour="Site")+
  ylim(0, 0.25)

Figure S4

##Create Panel
IN_HeatAssay_fig<-plot_grid(IN_PAM.plot.cut, IN_TolPAM.plot.cut, 
                      IN_Sym.plot.cut, IN_TolSym.plot.cut,
                      IN_Chl.plot.cut, IN_TolChl.plot.cut,
                    rel_widths=c(1, 0.75), 
                    rel_heights = c(1, 1, 1),
                    nrow=3, ncol=2, byrow=T, labels = c("A", "B", "C", "D", "E", "F"))

##Save Figure
ggsave(filename="Figures/03_Performance/FigS4_InitialHeatAssay.png", plot=IN_HeatAssay_fig, dpi=300, width=8, height=11, units="in")

Figure S5 Univariate Panels

Adjust Figures for Panel


##FvFm
TP1_TolPAM.plot.cut<-ggplot(TP1_TolPAM.sum, aes(x=Site, y=PAM.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=PAM.prop-se, ymax=PAM.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  ggtitle("TP1")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, face="bold", hjust=0.5),axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="", y="Photo. Effic. Retention", colour="Origin")+
  ylim(0.7, 1)+
  annotate("text", x=1, y=1, label="**", size=sig.sz, fontface="bold")

TP2_TolPAM.plot.cut<-ggplot(TP2_TolPAM.sum, aes(x=Site, y=PAM.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=PAM.prop-se, ymax=PAM.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  ggtitle("TP2")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, face="bold", hjust=0.5),axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="", y="", colour="Origin")+
  ylim(0.7, 1)+
  annotate("text", x=1, y=1, label="*", size=sig.sz, fontface="bold")

TP3_TolPAM.plot.cut<-ggplot(TP3_TolPAM.sum, aes(x=Site, y=PAM.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=PAM.prop-se, ymax=PAM.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  ggtitle("TP3")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, face="bold", hjust=0.5),axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="", y="", colour="Origin")+
  ylim(0.7, 1)

TP4_TolPAM.plot.cut<-ggplot(TP4_TolPAM.sum, aes(x=Site, y=PAM.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=PAM.prop-se, ymax=PAM.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  ggtitle("TP4")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, face="bold", hjust=0.5),axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="", y="", colour="Origin")+
  ylim(0.7, 1)


##Symbionts
TP1_TolSym.plot.cut<-ggplot(TP1_TolSym.sum, aes(x=Site, y=Sym.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Sym.prop-se, ymax=Sym.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="", y="Symbiont Retention", colour="Origin")+
  ylim(0.2, 1)+
  annotate("text", x=1, y=0.75, label="*", size=sig.sz, fontface="bold")

TP2_TolSym.plot.cut<-ggplot(TP2_TolSym.sum, aes(x=Site, y=Sym.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Sym.prop-se, ymax=Sym.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="", y="", colour="Origin")+
  ylim(0.2, 1)

TP3_TolSym.plot.cut<-ggplot(TP3_TolSym.sum, aes(x=Site, y=Sym.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Sym.prop-se, ymax=Sym.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="", y="", colour="Origin")+
  ylim(0.2, 1)

TP4_TolSym.plot.cut<-ggplot(TP4_TolSym.sum, aes(x=Site, y=Sym.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Sym.prop-se, ymax=Sym.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="", y="", colour="Origin")+
  ylim(0.2, 1)


##Chlorophyll
TP1_TolChl.plot.cut<-ggplot(TP1_TolChl.sum, aes(x=Site, y=Chl.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Chl.prop-se, ymax=Chl.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="Site and Origin", y="Chlorophyll Retention", colour="Origin")+
  ylim(0, .8)

TP2_TolChl.plot.cut<-ggplot(TP2_TolChl.sum, aes(x=Site, y=Chl.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Chl.prop-se, ymax=Chl.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="Site and Origin", y="", colour="Origin")+
  ylim(0, .8)

TP3_TolChl.plot.cut<-ggplot(TP3_TolChl.sum, aes(x=Site, y=Chl.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Chl.prop-se, ymax=Chl.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="Site and Origin", y="", colour="Origin")+
  ylim(0, .8)

TP4_TolChl.plot.cut<-ggplot(TP4_TolChl.sum, aes(x=Site, y=Chl.prop, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Chl.prop-se, ymax=Chl.prop+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y="", colour="Origin")+
  ylim(0, .8)

Figure S5

##Create Panel
Tol_fig<-plot_grid(
  TP1_TolPAM.plot.cut,TP2_TolPAM.plot.cut,TP3_TolPAM.plot.cut,TP4_TolPAM.plot.cut,
  TP1_TolSym.plot.cut,TP2_TolSym.plot.cut,TP3_TolSym.plot.cut,TP4_TolSym.plot.cut,
  TP1_TolChl.plot.cut,TP2_TolChl.plot.cut,TP3_TolChl.plot.cut,TP4_TolChl.plot.cut,
                    rel_widths=c(rep(c(0.7, 0.7, 0.7,1),3)), 
                    rel_heights = c(1,0.85,0.85),
                    nrow=3, ncol=4, byrow=T, labels = NULL)

##Save Figure
ggsave(filename="Figures/03_Performance/FigS5_ToleranceMetrics.png", plot=Tol_fig, dpi=300, width=12, height=10, units="in")

Tables

Table S5

##Dataframe of Performance Results 
##Model Results
TableS5<-data.frame(rbind(
   summary(TLE.lme)$coefficients[-1,],summary(TLE.lme_KL)$coefficients[-1,],
   summary(TLE.lme_SS)$coefficients[-1,],
   
   summary(Tol_PAM.lme_TP1)$coefficients[-1,],summary(Tol_PAM.lme_TP1_KL)$coefficients[-1,],
   summary(Tol_PAM.lme_TP1_SS)$coefficients[-1,],
   summary(Tol_Sym.lme_TP1)$coefficients[-1,],summary(Tol_Sym.lme_TP1_KL)$coefficients[-1,],
   summary(Tol_Sym.lme_TP1_SS)$coefficients[-1,], 
   summary(Tol_Chl.lme_TP1)$coefficients[-1,],summary(Tol_Chl.lme_TP1_KL)$coefficients[-1,],
   summary(Tol_Chl.lme_TP1_SS)$coefficients[-1,], 
   
    summary(Tol_PAM.lme_TP2)$coefficients[-1,],summary(Tol_PAM.lme_TP2_KL)$coefficients[-1,],
   summary(Tol_PAM.lme_TP2_SS)$coefficients[-1,],
   summary(Tol_Sym.lme_TP2)$coefficients[-1,],summary(Tol_Sym.lme_TP2_KL)$coefficients[-1,],
   summary(Tol_Sym.lme_TP2_SS)$coefficients[-1,], 
   summary(Tol_Chl.lme_TP2)$coefficients[-1,],summary(Tol_Chl.lme_TP2_KL)$coefficients[-1,],
   summary(Tol_Chl.lme_TP2_SS)$coefficients[-1,], 
   
      summary(Tol_PAM.lme_TP3)$coefficients[-1,],summary(Tol_PAM.lme_TP3_KL)$coefficients[-1,],
   summary(Tol_PAM.lme_TP3_SS)$coefficients[-1,],
   summary(Tol_Sym.lme_TP3)$coefficients[-1,],summary(Tol_Sym.lme_TP3_KL)$coefficients[-1,],
   summary(Tol_Sym.lme_TP3_SS)$coefficients[-1,], 
   summary(Tol_Chl.lme_TP3)$coefficients[-1,],summary(Tol_Chl.lme_TP3_KL)$coefficients[-1,],
   summary(Tol_Chl.lme_TP3_SS)$coefficients[-1,], 
   
      summary(Tol_PAM.lme_TP4)$coefficients[-1,],summary(Tol_PAM.lme_TP4_KL)$coefficients[-1,],
   summary(Tol_PAM.lme_TP4_SS)$coefficients[-1,],
   summary(Tol_Sym.lme_TP4)$coefficients[-1,],summary(Tol_Sym.lme_TP4_KL)$coefficients[-1,],
   summary(Tol_Sym.lme_TP4_SS)$coefficients[-1,], 
   summary(Tol_Chl.lme_TP4)$coefficients[-1,],summary(Tol_Chl.lme_TP4_KL)$coefficients[-1,],
   summary(Tol_Chl.lme_TP4_SS)$coefficients[-1,]))

names(TableS5)<-c("Estimate", "SE", "DF", "t", "p") 

##Metadata 
TableS5$Type<-c(rep("Growth", 5), rep("Tolerance", 60))
TableS5$Metric<-c(rep("Growth", 5), rep(c(rep("FvFm", 5), rep("Symbionts", 5), rep("Chlorophyll", 5)), 4))
TableS5$TimeP<-c(rep("TP1.2", 5), rep("TP1",15), rep("TP2",15), rep("TP3",15), rep("TP4",15))
TableS5$Predictor<-c(rep(c("Origin", "Site", "Origin x Site", "KL Origin", "SS Origin"), 13))

##Effect Size  
TableS5$EtaSq<-c(
  eta_squared(TLE.lme)$Eta2_partial,eta_squared(TLE.lme_KL)$Eta2_partial,
   eta_squared(TLE.lme_SS)$Eta2_partial,
   
   eta_squared(Tol_PAM.lme_TP1)$Eta2_partial,eta_squared(Tol_PAM.lme_TP1_KL)$Eta2_partial,
   eta_squared(Tol_PAM.lme_TP1_SS)$Eta2_partial,
   eta_squared(Tol_Sym.lme_TP1)$Eta2_partial,eta_squared(Tol_Sym.lme_TP1_KL)$Eta2_partial,
   eta_squared(Tol_Sym.lme_TP1_SS)$Eta2_partial, 
   eta_squared(Tol_Chl.lme_TP1)$Eta2_partial,eta_squared(Tol_Chl.lme_TP1_KL)$Eta2_partial,
   eta_squared(Tol_Chl.lme_TP1_SS)$Eta2_partial, 
   
    eta_squared(Tol_PAM.lme_TP2)$Eta2_partial,eta_squared(Tol_PAM.lme_TP2_KL)$Eta2_partial,
   eta_squared(Tol_PAM.lme_TP2_SS)$Eta2_partial,
   eta_squared(Tol_Sym.lme_TP2)$Eta2_partial,eta_squared(Tol_Sym.lme_TP2_KL)$Eta2_partial,
   eta_squared(Tol_Sym.lme_TP2_SS)$Eta2_partial, 
   eta_squared(Tol_Chl.lme_TP2)$Eta2_partial,eta_squared(Tol_Chl.lme_TP2_KL)$Eta2_partial,
   eta_squared(Tol_Chl.lme_TP2_SS)$Eta2_partial, 
   
      eta_squared(Tol_PAM.lme_TP3)$Eta2_partial,eta_squared(Tol_PAM.lme_TP3_KL)$Eta2_partial,
   eta_squared(Tol_PAM.lme_TP3_SS)$Eta2_partial,
   eta_squared(Tol_Sym.lme_TP3)$Eta2_partial,eta_squared(Tol_Sym.lme_TP3_KL)$Eta2_partial,
   eta_squared(Tol_Sym.lme_TP3_SS)$Eta2_partial, 
   eta_squared(Tol_Chl.lme_TP3)$Eta2_partial,eta_squared(Tol_Chl.lme_TP3_KL)$Eta2_partial,
   eta_squared(Tol_Chl.lme_TP3_SS)$Eta2_partial, 
   
      eta_squared(Tol_PAM.lme_TP4)$Eta2_partial,eta_squared(Tol_PAM.lme_TP4_KL)$Eta2_partial,
   eta_squared(Tol_PAM.lme_TP4_SS)$Eta2_partial,
   eta_squared(Tol_Sym.lme_TP4)$Eta2_partial,eta_squared(Tol_Sym.lme_TP4_KL)$Eta2_partial,
   eta_squared(Tol_Sym.lme_TP4_SS)$Eta2_partial, 
   eta_squared(Tol_Chl.lme_TP4)$Eta2_partial,eta_squared(Tol_Chl.lme_TP4_KL)$Eta2_partial,
   eta_squared(Tol_Chl.lme_TP4_SS)$Eta2_partial)

TableS5<-TableS5[,c(6:9, 1:5, 10)]

rownames(TableS5)<-NULL

##Save Table
write.csv(TableS5, "Outputs/TableS5.csv", row.names=FALSE)

Table S6

##Dataframe of Initial Thermal Tolerance Assay Results 
##Model Results
TableS6.model<-data.frame(rbind(
  summary(PAM.lme_IN)$coefficients[-1,], summary(Sym.lme_IN)$coefficients[-1,], summary(Chl.lme_IN)$coefficients[-1,]))

names(TableS6.model)<-c("Estimate", "SE", "DF", "t", "p") 

TableS6.emmeans<-data.frame(rbind(
data.frame(rbind(emmeans(PAM.lme_IN, pairwise ~ Site | Treatment)$contrasts[1], emmeans(PAM.lme_IN, pairwise ~ Site | Treatment)$contrasts[2], emmeans(PAM.lme_IN, pairwise ~ Treatment | Site)$contrasts[1], emmeans(PAM.lme_IN, pairwise ~ Treatment | Site)$contrasts[2]))[,-c(1:3)], 
data.frame(rbind(emmeans(Sym.lme_IN, pairwise ~ Site | Treatment)$contrasts[1], emmeans(Sym.lme_IN, pairwise ~ Site | Treatment)$contrasts[2], emmeans(Sym.lme_IN, pairwise ~ Treatment | Site)$contrasts[1], emmeans(Sym.lme_IN, pairwise ~ Treatment | Site)$contrasts[2]))[,-c(1:3)],
data.frame(rbind(emmeans(Chl.lme_IN, pairwise ~ Site | Treatment)$contrasts[1], emmeans(Chl.lme_IN, pairwise ~ Site | Treatment)$contrasts[2], emmeans(Chl.lme_IN, pairwise ~ Treatment | Site)$contrasts[1], emmeans(Chl.lme_IN, pairwise ~ Treatment | Site)$contrasts[2]))[,-c(1:3)]))

names(TableS6.emmeans)<-c("Estimate", "SE", "DF", "t", "p") 

TableS6<-rbind(TableS6.model[1:3,], TableS6.emmeans[1:4,], TableS6.model[4:6,], TableS6.emmeans[5:8,], TableS6.model[7:9,], TableS6.emmeans[9:12,])

##Metadata 
TableS6$Metric<-c(rep("FvFm", 7), rep("Symbionts", 7), rep("Chlorophyll", 7))
TableS6$Predictor<-c(rep(c("Site", "Treatment", "Site x Treatment", "Control Site", "Heated Site", "KL Treatment", "SS Treatment"), 3))


##Effect Size  
TableS6$EtaSq<-c(eta_squared(PAM.lme_IN)$Eta2_partial, NA, NA, NA, NA, eta_squared(Sym.lme_IN)$Eta2_partial, NA, NA, NA, NA, eta_squared(Chl.lme_IN)$Eta2_partial, NA, NA, NA, NA)

TableS6<-TableS6[,c(6:7, 1:5, 8)]

rownames(TableS6)<-NULL

##Save Table
write.csv(TableS6, "Outputs/TableS6.csv", row.names=FALSE)
  
LS0tDQp0aXRsZTogIkNvcmFsIFBlcmZvcm1hbmNlIEZvbGxvd2luZyBSZWNpcHJvY2FsIFRyYW5zcGxhbnQiDQphdXRob3I6ICJTZXJlbmEgSGFja2Vyb3R0IGFuZCBDYXJseSBUcmF2ZXJzIg0KZGF0ZTogIjEvMy8yMDI0Ig0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIGRmX3ByaW50OiBwYWdlZA0KLS0tDQoNCiMgU2V0dXANCg0KYGBge3IgU2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpDQpgYGANCg0KDQojIyMgTG9hZCBQYWNrYWdlcw0KYGBge3J9DQojI0luc3RhbGwgUGFja2FnZXMgaWYgTmVlZGVkDQppZiAoIXJlcXVpcmUoImdncGxvdDIiKSkgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQppZiAoIXJlcXVpcmUoImNvd3Bsb3QiKSkgaW5zdGFsbC5wYWNrYWdlcygiY293cGxvdCIpDQppZiAoIXJlcXVpcmUoImx1YnJpZGF0ZSIpKSBpbnN0YWxsLnBhY2thZ2VzKCJsdWJyaWRhdGUiKQ0KaWYgKCFyZXF1aXJlKCJjb3JycGxvdCIpKSBpbnN0YWxsLnBhY2thZ2VzKCJjb3JycGxvdCIpDQppZiAoIXJlcXVpcmUoImxtZTQiKSkgaW5zdGFsbC5wYWNrYWdlcygibG1lNCIpDQppZiAoIXJlcXVpcmUoInZlZ2FuIikpIGluc3RhbGwucGFja2FnZXMoInZlZ2FuIikNCmlmICghcmVxdWlyZSgiREhBUk1hIikpIGluc3RhbGwucGFja2FnZXMoIkRIQVJNYSIpDQppZiAoIXJlcXVpcmUoImVmZmVjdHNpemUiKSkgaW5zdGFsbC5wYWNrYWdlcygiZWZmZWN0c2l6ZSIpDQppZiAoIXJlcXVpcmUoImVtbWVhbnMiKSkgaW5zdGFsbC5wYWNrYWdlcygiZW1tZWFucyIpDQppZiAoIXJlcXVpcmUoImxtZXJUZXN0IikpIGluc3RhbGwucGFja2FnZXMoImxtZXJUZXN0IikNCmlmICghcmVxdWlyZSgidGlkeXIiKSkgaW5zdGFsbC5wYWNrYWdlcygidGlkeXIiKQ0KaWYgKCFyZXF1aXJlKCJkcGx5ciIpKSBpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpDQppZiAoIXJlcXVpcmUoInBsb3RyaXgiKSkgaW5zdGFsbC5wYWNrYWdlcygicGxvdHJpeCIpDQppZiAoIXJlcXVpcmUoIlJtaXNjIikpIGluc3RhbGwucGFja2FnZXMoIlJtaXNjIikNCmlmICghcmVxdWlyZSgiZ2dwdWJyIikpIGluc3RhbGwucGFja2FnZXMoImdncHViciIpDQoNCiMjTG9hZCBQYWNrYWdlcw0KbGlicmFyeShnZ3Bsb3QyKSAjUmVxdWlyZWQgZm9yIGdncGxvdHMNCmxpYnJhcnkoY293cGxvdCkgI1JlcXVpcmVkIGZvciBwbG90dGluZyBwYW5lbCBmaWd1cmVzDQpsaWJyYXJ5KGx1YnJpZGF0ZSkgI1JlcXVpcmVkIGZvciBkYXRlIGFuZCB0aW1lIGZvcm1hdHRpbmcNCmxpYnJhcnkoY29ycnBsb3QpICNSZXF1aXJlZCBmb3IgY29ycmVsYXRpb24gcGxvdA0KbGlicmFyeShsbWU0KSAjUmVxdWlyZWQgZm9yIG1peGVkIGVmZmVjdHMgbW9kZWxpbmcNCmxpYnJhcnkodmVnYW4pICNSZXF1aXJlZCBmb3IgbXVsdGl2YXJpYXRlIGFuYWx5c2lzIFBFUk0NCmxpYnJhcnkoREhBUk1hKSAjUmVxdWlyZWQgdG8gY2hlY2sgcmVzaWR1YWxzIG9mIG1peGVkIGVmZmVjdHMgbW9kZWxzDQpsaWJyYXJ5KGVmZmVjdHNpemUpICNSZXF1aXJlZCBmb3IgZXRhX3NxdWFyZWQgZWZmZWN0IHNpemVzDQpsaWJyYXJ5KGVtbWVhbnMpICNSZXF1aXJlZCBmb3IgcGFpcndpc2UgY29tcGFyaXNvbnMgDQpsaWJyYXJ5KGxtZXJUZXN0KSAjUmVxdWlyZWQgZm9yIHAgdmFsdWVzIHdpdGggbG1lNCBtb2RlbCBzdW1tYXJpZXMNCmxpYnJhcnkodGlkeXIpICNSZXF1aXJlZCBmb3IgcGl2b3Rfd2lkZXIgZnVuY3Rpb24NCmxpYnJhcnkoZHBseXIpICNSZXF1aXJlZCBmb3IgZ3JvdXBfYnkgZnVuY3Rpb24NCmxpYnJhcnkocGxvdHJpeCkgI1JlcXVpcmVkIGZvciBTdGFuZGFyZCBlcnJvciBmdW5jdGlvbg0KbGlicmFyeShSbWlzYykgI1JlcXVpcmVkIGZvciBTdW1tYXJ5U0UgZnVuY3Rpb24NCmxpYnJhcnkoZ2dwdWJyKSAjUmVxdWlyZWQgZm9yIHN0YXQgYnJhY2tldHMNCg0KYGBgDQoNCg0KIyMjIEdyYXBoaW5nIFBhcmFtZXRlcnMNCmBgYHtyfQ0KI05vdGU6IFJ1biAiR3JhcGhpbmcgUGFyYW1ldGVycyIgc2VjdGlvbiBmcm9tIDAxX0V4cGVyaW1lbnRhbFNldHVwLlJtZCBmaWxlDQpgYGANCg0KDQojIFNhbXBsZSBEYXRhIGFuZCBNZXRhZGF0YQ0KDQojIyMgTG9hZCBhbmQgT3JnYW5pemUgRGF0YQ0KYGBge3J9DQojI0dyb3d0aA0KTGVuZ3RoPC1yZWFkLmNzdigiRGF0YS9MZW5ndGguY3N2IiwgaGVhZGVyPVRSVUUpDQpEYXRlczwtcmVhZC5jc3YoIkRhdGEvQm9uYWlyZURhdGVzLmNzdiIsIGhlYWRlcj1UUlVFKQ0KDQojI1NldCBkYXRlIHZhcmlhYmxlcw0KRGF0ZXMkRGF0ZTwtYXMuRGF0ZShEYXRlcyREYXRlLCBmb3JtYXQ9JyVtLyVkLyVZJykNCg0KIyNTZXQgZmFjdG9yIHZhcmlhYmxlcw0KTGVuZ3RoJFNpdGU8LWZhY3RvcihMZW5ndGgkU2l0ZSwgbGV2ZWxzPWMoIktMIiwgIlNTIikpDQpMZW5ndGgkR2Vub3R5cGU8LWZhY3RvcihMZW5ndGgkR2Vub3R5cGUsIGxldmVscz1jKCJBQzgiLCAiQUMxMCIsICJBQzEyIikpDQpMZW5ndGgkT3JpZzwtZmFjdG9yKExlbmd0aCRPcmlnLCBsZXZlbHM9YygiTiIsICJUIikpDQpMZW5ndGgkT3JpZ2luPC1mYWN0b3IoTGVuZ3RoJE9yaWdpbiwgbGV2ZWxzPWMoIk5hdGl2ZSIsICJUcmFuc3BsYW50IikpDQoNCiMjQWRkIGEgU2FtcGxlIFNldCBWYXJpYWJsZQ0KTGVuZ3RoJFNldDwtcGFzdGUoTGVuZ3RoJFNpdGUsIExlbmd0aCRHZW5vdHlwZSwgTGVuZ3RoJE9yaWcsIHNlcD0iLiIpDQpMZW5ndGgkU2V0PC1mYWN0b3IoTGVuZ3RoJFNldCkNCg0KIyNBZGQgU2l0ZS5PcmlnIHZhcmlhYmxlDQpMZW5ndGgkU2l0ZS5PcmlnPC1wYXN0ZShMZW5ndGgkU2l0ZSwgTGVuZ3RoJE9yaWcsIHNlcD0iLiIpDQpMZW5ndGgkU2l0ZS5PcmlnPC1mYWN0b3IoTGVuZ3RoJFNpdGUuT3JpZywgbGV2ZWxzPWMoIktMLk4iLCAiS0wuVCIsICJTUy5OIiwgIlNTLlQiKSkNCg0KDQojI0JsZWFjaGluZyBNZXRyaWNzDQojTm90ZTogUGh5c2lvbG9naWNhbCBtZXRyaWNzIGNhbGN1bGF0ZWQgaW4gMDJfUGh5c2lvbG9neU1ldHJpY3MuUiBmaWxlDQpUaGVybWFsPC1yZWFkLmNzdigiT3V0cHV0cy9UaGVybURhdGEuY3N2IiwgaGVhZGVyPVRSVUUpDQoNCiMjU2V0IGZhY3RvciB2YXJpYWJsZXMNClRoZXJtYWwkVGltZVA8LWZhY3RvcihUaGVybWFsJFRpbWVQLCBsZXZlbHM9YygiSU4iLCAiVFAxIiwgIlRQMiIsICJUUDMiLCAiVFA0IikpDQpUaGVybWFsJFNpdGU8LWZhY3RvcihUaGVybWFsJFNpdGUsIGxldmVscz1jKCJLTCIsICJTUyIpKQ0KVGhlcm1hbCRHZW5vdHlwZTwtZmFjdG9yKFRoZXJtYWwkR2Vub3R5cGUsIGxldmVscz1jKCJBQzgiLCAiQUMxMCIsICJBQzEyIikpDQpUaGVybWFsJE9yaWc8LWZhY3RvcihUaGVybWFsJE9yaWcsIGxldmVscz1jKCJOIiwgIlQiKSkNClRoZXJtYWwkT3JpZ2luPC1mYWN0b3IoVGhlcm1hbCRPcmlnaW4sIGxldmVscz1jKCJOYXRpdmUiLCAiVHJhbnNwbGFudCIpKQ0KDQpgYGANCg0KDQojIEdyb3d0aA0KDQojIyMgR3Jvd3RoIFJhdGUgVFAxIHRvIFRQMg0KDQojIyMjIENhbGN1bGF0ZSBEYXlzDQpgYGB7cn0NCiMjU3Vic2V0IERhdGVzIGZvciBUUCAxIGFuZCBUUCAyIEdyb3d0aA0KR3Jvd3RoLkRhdGVzPC1zdWJzZXQoRGF0ZXMsIFRhc2s9PSJHcm93dGgiICYgVGltZVA9PSJUUDEiIHwNCiAgICAgICAgICAgICAgICAgICAgICAgVGFzaz09Ikdyb3d0aCIgJiBUaW1lUD09IlRQMiIgKQ0KDQojI0NvbnZlcnQgdG8gV2lkZSBmb3JtYXQNCkdyb3d0aC5EYXRlczwtR3Jvd3RoLkRhdGVzICU+JSAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IFRpbWVQLCB2YWx1ZXNfZnJvbSA9IERhdGUpDQoNCiMjQ2FsY3VsYXRlIE51bWJlciBvZiBEYXlzDQojVFAgMSB0byBUUDINCkdyb3d0aC5EYXRlcyRUUDEuMl9kYXlzPC10aW1lX2xlbmd0aChHcm93dGguRGF0ZXMkVFAyLUdyb3d0aC5EYXRlcyRUUDEsIHVuaXQ9ImRheXMiKQ0KDQpgYGANCg0KDQojIyMjIENhbGN1bGF0ZSBUb3RhbCBMaW5lYXIgRXh0ZW5zaW9uDQpgYGB7cn0NCiMjTWVyZ2UgTGVuZ3RoIERhdGEgd2l0aCBHcm93dGggRGF0ZXMNCiNNZXJnZXMgYnkgU2l0ZSBjb2x1bW4NCiNBZGRzIFRQMS4yX2RheXMgY29sdW1uDQpHcm93dGg8LW1lcmdlKExlbmd0aCwgR3Jvd3RoLkRhdGVzWyxjKC0yKV0sIGFsbC54PVRSVUUpDQoNCiMjQ2FsY3VsYXRlIExpbmVhciBFeHRlbnNpb24gKGNtKQ0KR3Jvd3RoJEV4dF9jbTwtR3Jvd3RoJFRMLlRQMl9jbS1Hcm93dGgkVEwuVFAxX2NtDQoNCiMjQ2FsY3VsYXRlIEdyb3d0aCBSYXRlIChjbS9kYXkpDQpHcm93dGgkVExFX2NtLmRheTwtR3Jvd3RoJEV4dF9jbS9Hcm93dGgkVFAxLjJfZGF5cw0KDQpgYGANCg0KDQojIyMjIERhdGEgUUMNCmBgYHtyfQ0KIyNTYW1wbGUgU2l6ZSBwZXIgU2V0DQpHcm93dGggJT4lIA0KICBkcGx5cjo6Z3JvdXBfYnkoU2V0KSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZShTYW1wbGVTaXplID0gbGVuZ3RoKFNldCkpDQoNCiMjQ2hlY2sgZm9yIE91dGxpZXJzDQpnZ3Bsb3QoR3Jvd3RoLCBhZXMoeD1TZXQsIHk9VExFX2NtLmRheSkpICsgDQogIGdlb21fYm94cGxvdChhbHBoYT0wLjUsIHNoYXBlPTIsIG91dGxpZXIuc2hhcGUgPSBOQSkrDQogIGdlb21faml0dGVyKHNoYXBlPTE2LCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXIoMC4xKSkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQ0KDQpgYGANCg0KUG90ZW50aWFsIG91dGxpZXJzIGhhdmUgYmVlbiByZS1tZWFzdXJlZCBhbmQgdGhlcmVmb3JlIHdpbGwgYmUgcmV0YWluZWQuIG49MTAgcGVyIFNpdGUsIEdlbm90eXBlLCBPcmlnaW4gZ3JvdXANCg0KDQojIyMgQ29tcGFyZSBHcm93dGggUmF0ZQ0KYGBge3J9DQojQ2hlY2sgbm9ybWFsaXR5DQpoaXN0KEdyb3d0aCRUTEVfY20uZGF5KQ0Kc2hhcGlyby50ZXN0KEdyb3d0aCRUTEVfY20uZGF5KQ0KI05vdCBub3JtYWwNCg0KaGlzdChsb2coR3Jvd3RoJFRMRV9jbS5kYXkrMSkpDQpzaGFwaXJvLnRlc3QobG9nKEdyb3d0aCRUTEVfY20uZGF5KzEpKQ0KIyNTdGlsbCBub3Qgbm9ybWFsDQoNCiMjQ29tcGFyZSBnZW5lcmFsaXplZCBsaW5lYXIgbWl4ZWQgZWZmZWN0cyBtb2RlbHMNClRMRS5nbG1yLmdhdXM8LWdsbWVyKFRMRV9jbS5kYXl+T3JpZ2luKlNpdGUrKDF8R2Vub3R5cGUpLCBkYXRhPUdyb3d0aCwgZmFtaWx5PWdhdXNzaWFuKGxpbms9ImlkZW50aXR5IikpDQpUTEUuZ2xtci5nYXVzLmw8LWdsbWVyKFRMRV9jbS5kYXl+T3JpZ2luKlNpdGUrKDF8R2Vub3R5cGUpLCBkYXRhPUdyb3d0aCwgZmFtaWx5PWdhdXNzaWFuKGxpbms9ImxvZyIpKQ0KVExFLmdsbXIuZ2F1cy5pPC1nbG1lcihUTEVfY20uZGF5fk9yaWdpbipTaXRlKygxfEdlbm90eXBlKSwgZGF0YT1Hcm93dGgsIGZhbWlseT1nYXVzc2lhbihsaW5rPSJpbnZlcnNlIikpDQoNClRMRS5nbG1yLmdhbS5sPC1nbG1lcihUTEVfY20uZGF5fk9yaWdpbipTaXRlKygxfEdlbm90eXBlKSwgZGF0YT1Hcm93dGgsIGZhbWlseT1HYW1tYShsaW5rPSJsb2ciKSkNClRMRS5nbG1yLmdhbS5pPC1nbG1lcihUTEVfY20uZGF5fk9yaWdpbipTaXRlKygxfEdlbm90eXBlKSwgZGF0YT1Hcm93dGgsIGZhbWlseT1HYW1tYShsaW5rPSJpbnZlcnNlIikpDQoNClRMRS5nbG1yLmludjwtZ2xtZXIoVExFX2NtLmRheX5PcmlnaW4qU2l0ZSsoMXxHZW5vdHlwZSksIGRhdGE9R3Jvd3RoLCBmYW1pbHk9aW52ZXJzZS5nYXVzc2lhbihsaW5rPSIxL211XjIiKSkNClRMRS5nbG1yLmludi5sPC1nbG1lcihUTEVfY20uZGF5fk9yaWdpbipTaXRlKygxfEdlbm90eXBlKSwgZGF0YT1Hcm93dGgsIGZhbWlseT1pbnZlcnNlLmdhdXNzaWFuKGxpbms9ImxvZyIpKQ0KVExFLmdsbXIuaW52Lmk8LWdsbWVyKFRMRV9jbS5kYXl+T3JpZ2luKlNpdGUrKDF8R2Vub3R5cGUpLCBkYXRhPUdyb3d0aCwgZmFtaWx5PWludmVyc2UuZ2F1c3NpYW4obGluaz0iaW52ZXJzZSIpKQ0KDQpBSUMoVExFLmdsbXIuZ2F1cywgVExFLmdsbXIuZ2F1cy5sLCBUTEUuZ2xtci5nYXVzLmksIFRMRS5nbG1yLmdhbS5sLCBUTEUuZ2xtci5nYW0uaSwgVExFLmdsbXIuaW52LCBUTEUuZ2xtci5pbnYubCwgVExFLmdsbXIuaW52LmkpDQpgYGANCg0KR2FtbWEgZGlzdHJpYnV0aW9uIHdpdGggbG9nLWxpbmsgaGFzIHRoZSBsb3dlc3QgQUlDLg0KDQoNCmBgYHtyfQ0KIyNDaGVjayByZXNpZHVhbHMNClRMRS5nbG1yLmdhbS5sX3JlcyA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IFRMRS5nbG1yLmdhbS5sLCBwbG90ID0gRikNCnBsb3QoVExFLmdsbXIuZ2FtLmxfcmVzKQ0KDQpgYGANCg0KDQpDb21wYXJlIHJlc2lkdWFscyBhY3Jvc3MgbW9kZWxzDQoNCmBgYHtyfQ0KIyNDaGVjayByZXNpZHVhbHMNClRMRS5nbG1yLmdhdXMubF9yZXMgPC0gc2ltdWxhdGVSZXNpZHVhbHMoZml0dGVkTW9kZWwgPSBUTEUuZ2xtci5nYXVzLmwsIHBsb3QgPSBGKQ0KcGxvdChUTEUuZ2xtci5nYXVzLmxfcmVzKQ0KDQpgYGANCg0KQ29tcGFyZSB3aXRoIGxvZysxIHRyYW5zZm9ybWVkIGxtZXIgbW9kZWwNCg0KYGBge3J9DQojI01vZGVsIHdpdGggbG9nICsxIHRyYW5zZm9ybWF0aW9uDQojRnVuY3Rpb24gb2YgU2l0ZSBhbmQgT3JpZ2luLCB3aXRoIEdlbm90eXBlIGFzIGEgUmFuZG9tIGVmZmVjdA0KI0ludGVyYWN0aW9uIGJldHdlZW4gU2l0ZSBhbmQgT3JpZ2luDQpUTEUubG1lPC1sbWVyKGxvZyhUTEVfY20uZGF5KzEpfk9yaWdpbipTaXRlKygxfEdlbm90eXBlKSwgZGF0YT1Hcm93dGgpDQoNCiMjQ2hlY2sgcmVzaWR1YWxzDQpUTEUubG1lX3JlcyA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IFRMRS5sbWUsIHBsb3QgPSBGKQ0KcGxvdChUTEUubG1lX3JlcykNCmBgYA0KQmV0dGVyIHJlc2lkdWFscyB3aXRoIHRoZSBsb2crMSB0cmFuc2Zvcm1lZCBsbWVyIG1vZGVsLg0KDQoNCmBgYHtyfQ0KIyNNb2RlbCByZXN1bHRzDQpzdW1tYXJ5KFRMRS5sbWUpDQoNCmV0YV9zcXVhcmVkKFRMRS5sbWUpDQpgYGANCg0KDQpFZmZlY3Qgc2l6ZSBvZiBPcmlnaW4gZm9yIGVhY2ggU2l0ZQ0KYGBge3J9DQojI0tMDQpUTEUubG1lX0tMPC1sbWVyKGxvZyhUTEVfY20uZGF5KzEpfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9R3Jvd3RoW3doaWNoKEdyb3d0aCRTaXRlPT0iS0wiKSxdKQ0Kc3VtbWFyeShUTEUubG1lX0tMKQ0KZXRhX3NxdWFyZWQoVExFLmxtZV9LTCkNCg0KDQojI1NTDQpUTEUubG1lX1NTPC1sbWVyKGxvZyhUTEVfY20uZGF5KzEpfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9R3Jvd3RoW3doaWNoKEdyb3d0aCRTaXRlPT0iU1MiKSxdKQ0Kc3VtbWFyeShUTEUubG1lX1NTKQ0KZXRhX3NxdWFyZWQoVExFLmxtZV9TUykNCg0KYGBgDQoNCg0KYGBge3IgUGxvdCBHcm93dGggUmF0ZSBUUDEgdG8gMn0NCiMjU3VtbWFyeSBzdGF0aXN0aWNzIGJ5IFNpdGUgYW5kIE9yaWdpbg0KVFAxLjJfR3Jvd3RoLnN1bTwtc3VtbWFyeVNFKEdyb3d0aCwgbWVhc3VyZXZhcj0iVExFX2NtLmRheSIsIGdyb3VwdmFycz1jKCJTaXRlIiwgIk9yaWdpbiIsICJTaXRlLk9yaWciKSwgbmEucm09VFJVRSkNCg0KIyNQbG90IEF2ZXJhZ2UgR3Jvd3RoIFJhdGUgYWNyb3NzIFRyZWF0bWVudHMNClRQMS4yX0dyb3d0aC5wbG90PC1nZ3Bsb3QoVFAxLjJfR3Jvd3RoLnN1bSwgYWVzKHg9U2l0ZSwgeT1UTEVfY20uZGF5LCBjb2xvdXI9U2l0ZS5PcmlnKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9T3JpZy5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49VExFX2NtLmRheS1zZSwgeW1heD1UTEVfY20uZGF5K3NlKSwgd2lkdGg9Y2FwLnN6LCBsaW5ld2lkdGg9YmFyLnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSArDQogIGdlb21fcG9pbnQoc2l6ZT1wb2ludC5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIA0KICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT1sZWcudHh0LnN6KSwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPWxlZy50aXRsZS5zeiksIA0KICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiYmxhY2siKSkrDQogIGxhYnMoeD0iU2l0ZSBhbmQgT3JpZ2luIiwgeT1leHByZXNzaW9uKHBhc3RlKCdHcm93dGggUmF0ZSAoY20gZGF5J14tMSoiKSIpKSwgY29sb3VyPSJPcmlnaW4iKSsNCiAgeWxpbSgwLCAwLjI1KSsNCiAgYW5ub3RhdGUoInRleHQiLCB4PTIsIHk9MC4yNCwgbGFiZWw9IioiLCBzaXplPXNpZy5zeiwgZm9udGZhY2U9ImJvbGQiKSsNCiAgZ2VvbV9icmFja2V0KHhtaW49MSwgeG1heD0yLCB5LnBvc2l0aW9uPTAuMDEsIGxhYmVsLnNpemU9bGV2ZWxzLnN6LCBsYWJlbD0iKioiLCBpbmhlcml0LmFlcyA9IEZBTFNFKTsgVFAxLjJfR3Jvd3RoLnBsb3QNCmBgYA0KDQoNCiMjIyBBdmVyYWdlIEdyb3d0aCBSYXRlcyBieSBHZW5vdHlwZQ0KYGBge3J9DQojI1N1bW1hcnkgc3RhdGlzdGljcyBieSBHZW5vdHlwZSBhbmQgT3JpZ2luDQpUUDEuMl9Hcm93dGguc3VtLlNTPC1zdW1tYXJ5U0Uoc3Vic2V0KEdyb3d0aCwgU2l0ZT09IlNTIiksIG1lYXN1cmV2YXI9IlRMRV9jbS5kYXkiLCBncm91cHZhcnM9YygiR2Vub3R5cGUiLCAiT3JpZ2luIiksIG5hLnJtPVRSVUUpDQoNClRQMS4yX0dyb3d0aC5zdW0uU1MNCg0KIyNDYWxjdWxhdGUgUGVyY2VudCBEaWZmZXJlbmNlIGJldHdlZW4gTmF0aXZlIGFuZCBUcmFuc3BsYW50IGJ5IEdlbm90eXBlDQpUUDEuMl9Hcm93dGguU1M8LVRQMS4yX0dyb3d0aC5zdW0uU1Nbd2hpY2goVFAxLjJfR3Jvd3RoLnN1bS5TUyRPcmlnaW49PSJOYXRpdmUiKSwgYygxLDQpXQ0KbmFtZXMoVFAxLjJfR3Jvd3RoLlNTKVsyXTwtcGFzdGUobmFtZXMoVFAxLjJfR3Jvd3RoLlNTKVsyXSwgIk4iLCBzZXA9Il8iKQ0KVFAxLjJfR3Jvd3RoLlNTJFRMRV9jbS5kYXlfVDwtVFAxLjJfR3Jvd3RoLnN1bS5TUyRUTEVfY20uZGF5W3doaWNoKFRQMS4yX0dyb3d0aC5zdW0uU1MkT3JpZ2luPT0iVHJhbnNwbGFudCIpXQ0KVFAxLjJfR3Jvd3RoLlNTJFBlcmMuSW5jPC0oKFRQMS4yX0dyb3d0aC5TUyRUTEVfY20uZGF5X04tVFAxLjJfR3Jvd3RoLlNTJFRMRV9jbS5kYXlfVCkvVFAxLjJfR3Jvd3RoLlNTJFRMRV9jbS5kYXlfVCkqMTAwDQoNClRQMS4yX0dyb3d0aC5TUw0KDQojI01lYW4gYW5kIFN0YW5kYXJkIEVycm9yDQptZWFuKFRQMS4yX0dyb3d0aC5TUyRQZXJjLkluYykNCnN0ZC5lcnJvcihUUDEuMl9Hcm93dGguU1MkUGVyYy5JbmMpDQpgYGANCg0KDQojIFRoZXJtYWwgVG9sZXJhbmNlDQoNCiMjIyBQZXJjZW50IFJldGVudGlvbg0KDQojIyMjIFN1YnNldCBUaGVybWFsIEFzc2F5IERhdGEgYnkgVHJlYXRtZW50DQpgYGB7cn0NCiMjQ29udHJvbA0KVGhlcm1fQzwtc3Vic2V0KFRoZXJtYWwsIFRyZWF0PT0iQyIpDQoNCiMjSGVhdGVkDQpUaGVybV9IPC1zdWJzZXQoVGhlcm1hbCwgVHJlYXQ9PSJIIikNCmBgYA0KDQoNCiMjIyMgQ2FsY3VsYXRlIFBlcmNlbnQgUmV0ZW50aW9uDQpDYWxjdWxhdGluZyByZXRlbnRpb24gYXMgcHJvcG9ydGlvbiByZW1haW5pbmcgcmVsYXRpdmUgdG8gY29ycmVzcG9uZGluZyBjb250cm9sIGxldmVscyAoMC0xKSBmb3IgZWFjaCBzaXRlIGFuZCBnZW5vdHlwZSBhdCBlYWNoIHRpbWVwb2ludC4NCmBgYHtyfQ0KIyNDYWxjdWxhdGUgYXZlcmFnZXMgZm9yIENvbnRyb2wgVHJlYXRtZW50IGZvciBlYWNoIFNpdGUsIEdlbm90eXBlLCBhbmQgVGltZXBvaW50IA0KVGhlcm1fQzwtbmEub21pdChUaGVybV9DKQ0KbmFtZXMoVGhlcm1fQykNClRoZXJtX0MuYTwtYWdncmVnYXRlKFRoZXJtX0NbLGMoMTM6MTUpXSwgbGlzdChUaGVybV9DJFNpdGUsIFRoZXJtX0MkR2Vub3R5cGUsIFRoZXJtX0MkVGltZVAsIFRoZXJtX0MkT3JpZ2luKSwgbWVhbiwgbmEuYWN0aW9uID0gbmEub21pdCkNCm5hbWVzKFRoZXJtX0MuYSlbMTo0XTwtYygiU2l0ZSIsICJHZW5vdHlwZSIsICJUaW1lUCIsICJPcmlnaW4iKQ0KbmFtZXMoVGhlcm1fQy5hKVs1OjddPC1wYXN0ZShuYW1lcyhUaGVybV9DLmEpWzU6N10sICJDIiwgc2VwPSJfIikNCg0KIyNNZXJnZSBDb250cm9sIEF2ZXJhZ2VzIHdpdGggSGVhdGVkIFNhbXBsZXMNCiNNZXJnZXMgYnkgU2l0ZSwgR2Vub3R5cGUsIGFuZCBUaW1lcG9pbnQNClRoZXJtX0g8LW1lcmdlKFRoZXJtX0gsIFRoZXJtX0MuYSwgYWxsLng9VFJVRSApDQoNCiMjQ2FsY3VsYXRlIFByb3BvcnRpb24gUmV0YWluZWQgZm9yIGVhY2ggQmxlYWNoaW5nIE1ldHJpYyByZWxhdGl2ZSB0byBDb250cm9sDQpUaGVybV9IJENobC5wcm9wPC1yb3VuZCgoVGhlcm1fSCRDaGxfdWcuY20yL1RoZXJtX0gkQ2hsX3VnLmNtMl9DKSwgNCkNClRoZXJtX0gkU3ltLnByb3A8LXJvdW5kKChUaGVybV9IJFN5bTEwLjZfY20yL1RoZXJtX0gkU3ltMTAuNl9jbTJfQyksIDQpDQpUaGVybV9IJFBBTS5wcm9wPC1yb3VuZCgoVGhlcm1fSCRGdl9GbS9UaGVybV9IJEZ2X0ZtX0MpLCA0KQ0KDQojI1NldCB2YWx1ZXMgPjEgdG8gMQ0KVGhlcm1fSCRDaGwucHJvcFt3aGljaChUaGVybV9IJENobC5wcm9wPjEpXTwtMS4wMDAwDQpUaGVybV9IJFN5bS5wcm9wW3doaWNoKFRoZXJtX0gkU3ltLnByb3A+MSldPC0xLjAwMDANClRoZXJtX0gkUEFNLnByb3Bbd2hpY2goVGhlcm1fSCRQQU0ucHJvcD4xKV08LTEuMDAwMA0KDQpgYGANCg0KDQojIEluaXRpYWwgSGVhdCBBc3NheSANCg0KYGBge3J9DQojI1N1YnNldCBJbml0aWFsIFRpbWVwb2ludA0KVGhlcm1hbF9JTjwtc3Vic2V0KFRoZXJtYWwsIFRpbWVQPT0iSU4iKQ0KVGhlcm1hbF9JTiRTaXRlLlRyZWF0PC1wYXN0ZShUaGVybWFsX0lOJFNpdGUsIFRoZXJtYWxfSU4kVHJlYXQsIHNlcD0iLiIpDQpUaGVybWFsX0lOJFNpdGUuVHJlYXQ8LWZhY3RvcihUaGVybWFsX0lOJFNpdGUuVHJlYXQsIGxldmVscz1jKCJLTC5DIiwgIktMLkgiLCAiU1MuQyIsICJTUy5IIikpDQoNCg0KVGhlcm1fSU48LXN1YnNldChUaGVybV9ILCBUaW1lUD09IklOIikNCmBgYA0KDQoNCiMjIyBIZWF0ZWQgdnMgQ29udHJvbA0KDQoNCiMjIyMgU3ltYmlvbnRzDQpgYGB7cn0NCiNDaGVjayBub3JtYWxpdHkNCmhpc3QoVGhlcm1hbF9JTiRTeW0xMC42X2NtMikNCnNoYXBpcm8udGVzdChUaGVybWFsX0lOJFN5bTEwLjZfY20yKQ0KI05vdCBub3JtYWwNCg0KaGlzdChsb2coVGhlcm1hbF9JTiRTeW0xMC42X2NtMisxKSkNCnNoYXBpcm8udGVzdChsb2coVGhlcm1hbF9JTiRTeW0xMC42X2NtMisxKSkNCiNOb3JtYWwNCg0KIyNNb2RlbA0KI0Z1bmN0aW9uIG9mIFNpdGUgYW5kIFRyZWF0bWVudCwgd2l0aCBHZW5vdHlwZSBhcyBhIFJhbmRvbSBlZmZlY3QNClN5bS5sbWVfSU48LWxtZXIobG9nKFN5bTEwLjZfY20yKzEpflNpdGUqVHJlYXRtZW50KygxfEdlbm90eXBlKSwgZGF0YT1UaGVybWFsX0lOKQ0KDQojI0NoZWNrIHJlc2lkdWFscw0KU3ltLmxtZV9yZXNfSU4gPC0gc2ltdWxhdGVSZXNpZHVhbHMoZml0dGVkTW9kZWwgPSBTeW0ubG1lX0lOLCBwbG90ID0gRikNCnBsb3QoU3ltLmxtZV9yZXNfSU4pDQoNCiMjTW9kZWwgcmVzdWx0cw0Kc3VtbWFyeShTeW0ubG1lX0lOKQ0KDQpldGFfc3F1YXJlZChTeW0ubG1lX0lOKQ0KDQplbW1lYW5zKFN5bS5sbWVfSU4sIHBhaXJ3aXNlIH4gU2l0ZSB8IFRyZWF0bWVudCkNCg0KZW1tZWFucyhTeW0ubG1lX0lOLCBwYWlyd2lzZSB+IFRyZWF0bWVudCB8IFNpdGUpDQoNCmBgYA0KDQoNCmBgYHtyIFBsb3QgU3ltYmlvbnRzIEluaXRpYWx9DQojI1N1bW1hcnkgc3RhdGlzdGljcyBieSBTaXRlDQpJTl9TeW0uc3VtPC1zdW1tYXJ5U0UoVGhlcm1hbF9JTiwgbWVhc3VyZXZhcj0iU3ltMTAuNl9jbTIiLCBncm91cHZhcnM9YygiU2l0ZSIsICJUcmVhdG1lbnQiLCAiU2l0ZS5UcmVhdCIpLCBuYS5ybT1UUlVFKQ0KDQojI1Bsb3QgQXZlcmFnZSBTeW1iaW9udHMgYWNyb3NzIFRyZWF0bWVudHMNCklOX1N5bS5wbG90PC1nZ3Bsb3QoSU5fU3ltLnN1bSwgYWVzKHg9U2l0ZS5UcmVhdCwgeT1TeW0xMC42X2NtMiwgY29sb3VyPVNpdGUpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1TaXRlLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1TeW0xMC42X2NtMi1zZSwgeW1heD1TeW0xMC42X2NtMitzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KGFlcyhzaGFwZT1UcmVhdG1lbnQpLCBzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDEsMTYpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpKSsNCiAgbGFicyh4PSJTaXRlIGFuZCBUcmVhdG1lbnQiLCB5PWV4cHJlc3Npb24ocGFzdGUoJ1N5bWJpb250IERlbnNpdHkgKCcqMTBeNiwnY2VsbHMgY20nXi0yKiIpIikpLCBjb2xvdXI9IlNpdGUiKSsNCiAgeWxpbSgwLCAxKTsgSU5fU3ltLnBsb3QNCmBgYA0KDQoNCiMjIyMgQ2hsb3JvcGh5bGwNCmBgYHtyfQ0KI0NoZWNrIG5vcm1hbGl0eQ0KaGlzdChUaGVybWFsX0lOJENobF91Zy5jbTIpDQpzaGFwaXJvLnRlc3QoVGhlcm1hbF9JTiRDaGxfdWcuY20yKQ0KI05vdCBub3JtYWwNCg0KaGlzdChsb2coVGhlcm1hbF9JTiRDaGxfdWcuY20yKzEpKQ0Kc2hhcGlyby50ZXN0KGxvZyhUaGVybWFsX0lOJENobF91Zy5jbTIrMSkpDQojU3RpbGwgbm90IG5vcm1hbCBidXQgbGVzcyBza2V3ZWQNCg0KIyNNb2RlbA0KI0Z1bmN0aW9uIG9mIFNpdGUgYW5kIFRyZWF0bWVudCwgd2l0aCBHZW5vdHlwZSBhcyBhIFJhbmRvbSBlZmZlY3QNCkNobC5sbWVfSU48LWxtZXIobG9nKENobF91Zy5jbTIrMSl+U2l0ZSpUcmVhdG1lbnQrKDF8R2Vub3R5cGUpLCBkYXRhPVRoZXJtYWxfSU4pDQoNCiMjQ2hlY2sgcmVzaWR1YWxzDQpDaGwubG1lX3Jlc19JTiA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IENobC5sbWVfSU4sIHBsb3QgPSBGKQ0KcGxvdChDaGwubG1lX3Jlc19JTikNCg0KIyNNb2RlbCByZXN1bHRzDQpzdW1tYXJ5KENobC5sbWVfSU4pDQoNCmV0YV9zcXVhcmVkKENobC5sbWVfSU4pDQoNCmVtbWVhbnMoQ2hsLmxtZV9JTiwgcGFpcndpc2UgfiBTaXRlIHwgVHJlYXRtZW50KQ0KDQplbW1lYW5zKENobC5sbWVfSU4sIHBhaXJ3aXNlIH4gVHJlYXRtZW50IHwgU2l0ZSkNCg0KYGBgDQoNCg0KYGBge3IgUGxvdCBDaGxvcm9waHlsbCBJbml0aWFsfQ0KIyNTdW1tYXJ5IHN0YXRpc3RpY3MgYnkgU2l0ZQ0KSU5fQ2hsLnN1bTwtc3VtbWFyeVNFKFRoZXJtYWxfSU4sIG1lYXN1cmV2YXI9IkNobF91Zy5jbTIiLCBncm91cHZhcnM9YygiU2l0ZSIsICJUcmVhdG1lbnQiLCAiU2l0ZS5UcmVhdCIpLCBuYS5ybT1UUlVFKQ0KDQojI1Bsb3QgQXZlcmFnZSBDaGxvcm9waHlsbCBhY3Jvc3MgVHJlYXRtZW50cw0KSU5fQ2hsLnBsb3Q8LWdncGxvdChJTl9DaGwuc3VtLCBhZXMoeD1TaXRlLlRyZWF0LCB5PUNobF91Zy5jbTIsIGNvbG91cj1TaXRlKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9U2l0ZS5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49Q2hsX3VnLmNtMi1zZSwgeW1heD1DaGxfdWcuY20yK3NlKSwgd2lkdGg9Y2FwLnN6LCBsaW5ld2lkdGg9YmFyLnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSArDQogIGdlb21fcG9pbnQoYWVzKHNoYXBlPVRyZWF0bWVudCksIHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPWMoMSwxNikpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnR4dC5zeiksIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1sZWcudGl0bGUuc3opLCANCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIikpKw0KICBsYWJzKHg9IlNpdGUgYW5kIFRyZWF0bWVudCIsIHk9ZXhwcmVzc2lvbihwYXN0ZSgnVG90YWwgQ2hsb3JvcGh5bGwgKFx1MDNCQ2cgY20nXi0yKiIpIikpLCBjb2xvdXI9IlNpdGUiKSsNCiAgeWxpbSgwLCAxLjI1KTsgSU5fQ2hsLnBsb3QNCmBgYA0KDQoNCiMjIyMgRnZGbQ0KYGBge3J9DQojQ2hlY2sgbm9ybWFsaXR5DQpoaXN0KFRoZXJtYWxfSU4kRnZfRm0pDQpzaGFwaXJvLnRlc3QoVGhlcm1hbF9JTiRGdl9GbSkNCiNOb3Qgbm9ybWFsDQoNCmhpc3QobG9nKFRoZXJtYWxfSU4kRnZfRm0rMSkpDQpzaGFwaXJvLnRlc3QobG9nKFRoZXJtYWxfSU4kRnZfRm0rMSkpDQojU3RpbGwgbm90IG5vcm1hbCBidXQgbGVzcyBza2V3ZWQNCg0KIyNNb2RlbA0KI0Z1bmN0aW9uIG9mIFNpdGUgYW5kIFRyZWF0bWVudCwgd2l0aCBHZW5vdHlwZSBhcyBhIFJhbmRvbSBlZmZlY3QNClBBTS5sbWVfSU48LWxtZXIobG9nKEZ2X0ZtKzEpflNpdGUqVHJlYXRtZW50KygxfEdlbm90eXBlKSwgZGF0YT1UaGVybWFsX0lOKQ0KDQojI0NoZWNrIHJlc2lkdWFscw0KUEFNLmxtZV9yZXNfSU4gPC0gc2ltdWxhdGVSZXNpZHVhbHMoZml0dGVkTW9kZWwgPSBQQU0ubG1lX0lOLCBwbG90ID0gRikNCnBsb3QoUEFNLmxtZV9yZXNfSU4pDQoNCiMjTW9kZWwgcmVzdWx0cw0Kc3VtbWFyeShQQU0ubG1lX0lOKQ0KDQpldGFfc3F1YXJlZChQQU0ubG1lX0lOKQ0KDQplbW1lYW5zKFBBTS5sbWVfSU4sIHBhaXJ3aXNlIH4gU2l0ZSB8IFRyZWF0bWVudCkNCg0KZW1tZWFucyhQQU0ubG1lX0lOLCBwYWlyd2lzZSB+IFRyZWF0bWVudCB8IFNpdGUpDQoNCmBgYA0KTm90IG5vcm1hbCwgYnV0IG1vZGVsIHJlc2lkdWFscyBhcmUgT0suDQoNCg0KYGBge3IgUGxvdCBGdkZtIEluaXRpYWx9DQojI1N1bW1hcnkgc3RhdGlzdGljcyBieSBTaXRlDQpJTl9QQU0uc3VtPC1zdW1tYXJ5U0UoVGhlcm1hbF9JTiwgbWVhc3VyZXZhcj0iRnZfRm0iLCBncm91cHZhcnM9YygiU2l0ZSIsICJUcmVhdG1lbnQiLCAiU2l0ZS5UcmVhdCIpLCBuYS5ybT1UUlVFKQ0KDQojI1Bsb3QgQXZlcmFnZSBGdkZtIGFjcm9zcyBUcmVhdG1lbnRzDQpJTl9QQU0ucGxvdDwtZ2dwbG90KElOX1BBTS5zdW0sIGFlcyh4PVNpdGUuVHJlYXQsIHk9RnZfRm0sIGNvbG91cj1TaXRlKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9U2l0ZS5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49RnZfRm0tc2UsIHltYXg9RnZfRm0rc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChhZXMoc2hhcGU9VHJlYXRtZW50KSwgc2l6ZT1wb2ludC5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkrDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXM9YygxLDE2KSkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIA0KICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT1sZWcudHh0LnN6KSwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPWxlZy50aXRsZS5zeiksIA0KICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiYmxhY2siKSkrDQogIGxhYnMoeD0iU2l0ZSBhbmQgVHJlYXRtZW50IiwgeT0iUGhvdG9jaGVtaWNhbCBFZmZpY2llbmN5IChGdi9GbSkiLCBjb2xvdXI9IlNpdGUiKSsNCiAgeWxpbSgwLjUsIDAuNjU1KTsgSU5fUEFNLnBsb3QNCmBgYA0KDQoNCiMjIyBSZXRlbnRpb24gYnkgU2l0ZQ0KDQojIyMjIFN5bWJpb250cw0KYGBge3J9DQojQ2hlY2sgbm9ybWFsaXR5DQpoaXN0KFRoZXJtX0lOJFN5bS5wcm9wKQ0Kc2hhcGlyby50ZXN0KFRoZXJtX0lOJFN5bS5wcm9wKQ0KI05vcm1hbA0KDQojI01vZGVsDQojRnVuY3Rpb24gb2YgU2l0ZSwgd2l0aCBHZW5vdHlwZSBhcyBhIFJhbmRvbSBlZmZlY3QNClRvbF9TeW0ubG1lX0lOPC1sbWVyKFN5bS5wcm9wflNpdGUrKDF8R2Vub3R5cGUpLCBkYXRhPVRoZXJtX0lOKQ0KDQojI0NoZWNrIHJlc2lkdWFscw0KVG9sX1N5bS5sbWVfcmVzX0lOIDwtIHNpbXVsYXRlUmVzaWR1YWxzKGZpdHRlZE1vZGVsID0gVG9sX1N5bS5sbWVfSU4sIHBsb3QgPSBGKQ0KcGxvdChUb2xfU3ltLmxtZV9yZXNfSU4pDQoNCiMjTW9kZWwgcmVzdWx0cw0Kc3VtbWFyeShUb2xfU3ltLmxtZV9JTikNCg0KZXRhX3NxdWFyZWQoVG9sX1N5bS5sbWVfSU4pDQoNCmBgYA0KDQoNCmBgYHtyIFBsb3QgU3ltYmlvbnQgUmV0ZW50aW9uIEluaXRpYWx9DQojI1N1bW1hcnkgc3RhdGlzdGljcyBieSBTaXRlDQpJTl9Ub2xTeW0uc3VtPC1zdW1tYXJ5U0UoVGhlcm1fSU4sIG1lYXN1cmV2YXI9IlN5bS5wcm9wIiwgZ3JvdXB2YXJzPWMoIlNpdGUiKSwgbmEucm09VFJVRSkNCg0KIyNQbG90IEF2ZXJhZ2UgU3ltYmlvbnQgUmV0ZW50aW9uIGFjcm9zcyBUcmVhdG1lbnRzDQpJTl9Ub2xTeW0ucGxvdDwtZ2dwbG90KElOX1RvbFN5bS5zdW0sIGFlcyh4PVNpdGUsIHk9U3ltLnByb3AsIGNvbG91cj1TaXRlKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9U2l0ZS5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49U3ltLnByb3Atc2UsIHltYXg9U3ltLnByb3Arc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpKSsNCiAgbGFicyh4PSJTaXRlIiwgeT0iU3ltYmlvbnQgUmV0ZW50aW9uIiwgY29sb3VyPSJTaXRlIikrDQogIHlsaW0oMCwgMSkrDQogIGFubm90YXRlKCJ0ZXh0IiwgeD0xLjUsIHk9MC43NSwgbGFiZWw9Ii0iLCBzaXplPXNpZy5zeiwgZm9udGZhY2U9ImJvbGQiKTsgSU5fVG9sU3ltLnBsb3QNCmBgYA0KDQoNCiMjIyMgQ2hsb3JvcGh5bGwNCmBgYHtyfQ0KI0NoZWNrIG5vcm1hbGl0eQ0KaGlzdChUaGVybV9JTiRDaGwucHJvcCkNCnNoYXBpcm8udGVzdChUaGVybV9JTiRDaGwucHJvcCkNCiNOb3JtYWwNCg0KIyNNb2RlbA0KI0Z1bmN0aW9uIG9mIFNpdGUsIHdpdGggR2Vub3R5cGUgYXMgYSBSYW5kb20gZWZmZWN0DQpUb2xfQ2hsLmxtZV9JTjwtbG1lcihDaGwucHJvcH5TaXRlKygxfEdlbm90eXBlKSwgZGF0YT1UaGVybV9JTikNCg0KIyNDaGVjayByZXNpZHVhbHMNClRvbF9DaGwubG1lX3Jlc19JTiA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IFRvbF9DaGwubG1lX0lOLCBwbG90ID0gRikNCnBsb3QoVG9sX0NobC5sbWVfcmVzX0lOKQ0KDQojI01vZGVsIHJlc3VsdHMNCnN1bW1hcnkoVG9sX0NobC5sbWVfSU4pDQoNCmV0YV9zcXVhcmVkKFRvbF9DaGwubG1lX0lOKQ0KDQpgYGANCg0KDQpgYGB7ciBQbG90IENobG9yb3BoeWxsIFJldGVudGlvbiBJbml0aWFsfQ0KIyNTdW1tYXJ5IHN0YXRpc3RpY3MgYnkgU2l0ZSBhbmQgT3JpZ2luDQpJTl9Ub2xDaGwuc3VtPC1zdW1tYXJ5U0UoVGhlcm1fSU4sIG1lYXN1cmV2YXI9IkNobC5wcm9wIiwgZ3JvdXB2YXJzPWMoIlNpdGUiKSwgbmEucm09VFJVRSkNCg0KIyNQbG90IEF2ZXJhZ2UgQ2hsb3JvcGh5bGwgUmV0ZW50aW9uIGFjcm9zcyBUcmVhdG1lbnRzDQpJTl9Ub2xDaGwucGxvdDwtZ2dwbG90KElOX1RvbENobC5zdW0sIGFlcyh4PVNpdGUsIHk9Q2hsLnByb3AsIGNvbG91cj1TaXRlKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9U2l0ZS5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49Q2hsLnByb3Atc2UsIHltYXg9Q2hsLnByb3Arc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpKSsNCiAgbGFicyh4PSJTaXRlIiwgeT0iQ2hsb3JvcGh5bGwgUmV0ZW50aW9uIiwgY29sb3VyPSJTaXRlIikrDQogIHlsaW0oMCwgMC4zNSk7IElOX1RvbENobC5wbG90DQpgYGANCg0KDQojIyMjIEZ2Rm0NCmBgYHtyfQ0KI0NoZWNrIG5vcm1hbGl0eQ0KaGlzdChUaGVybV9JTiRQQU0ucHJvcCkNCnNoYXBpcm8udGVzdChUaGVybV9JTiRQQU0ucHJvcCkNCiNOb3Qgbm9ybWFsDQoNCmhpc3QobG9nKFRoZXJtX0lOJFBBTS5wcm9wKzEpKQ0Kc2hhcGlyby50ZXN0KGxvZyhUaGVybV9JTiRQQU0ucHJvcCsxKSkNCiMjU3RpbGwgbm90IG5vcm1hbA0KDQojI01vZGVsDQojRnVuY3Rpb24gb2YgU2l0ZSwgd2l0aCBHZW5vdHlwZSBhcyBhIFJhbmRvbSBlZmZlY3QNClRvbF9QQU0ubG1lX0lOPC1sbWVyKFBBTS5wcm9wflNpdGUrKDF8R2Vub3R5cGUpLCBkYXRhPVRoZXJtX0lOKQ0KDQojI0NoZWNrIHJlc2lkdWFscw0KVG9sX1BBTS5sbWVfcmVzX0lOIDwtIHNpbXVsYXRlUmVzaWR1YWxzKGZpdHRlZE1vZGVsID0gVG9sX1BBTS5sbWVfSU4sIHBsb3QgPSBGKQ0KcGxvdChUb2xfUEFNLmxtZV9yZXNfSU4pDQoNCiMjTW9kZWwgcmVzdWx0cw0Kc3VtbWFyeShUb2xfUEFNLmxtZV9JTikNCg0KZXRhX3NxdWFyZWQoVG9sX1BBTS5sbWVfSU4pDQoNCmBgYA0KTm90IG5vcm1hbCwgYnV0IG1vZGVsIHJlc2lkdWFscyBhcmUgT0suDQoNCg0KYGBge3IgUGxvdCBGdkZtIFJldGVudGlvbiBJbml0aWFsfQ0KIyNTdW1tYXJ5IHN0YXRpc3RpY3MgYnkgU2l0ZSBhbmQgT3JpZ2luDQpJTl9Ub2xQQU0uc3VtPC1zdW1tYXJ5U0UoVGhlcm1fSU4sIG1lYXN1cmV2YXI9IlBBTS5wcm9wIiwgZ3JvdXB2YXJzPWMoIlNpdGUiKSwgbmEucm09VFJVRSkNCg0KIyNQbG90IEF2ZXJhZ2UgRnZGbSBSZXRlbnRpb24gYWNyb3NzIFRyZWF0bWVudHMNCklOX1RvbFBBTS5wbG90PC1nZ3Bsb3QoSU5fVG9sUEFNLnN1bSwgYWVzKHg9U2l0ZSwgeT1QQU0ucHJvcCwgY29sb3VyPVNpdGUpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1TaXRlLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1QQU0ucHJvcC1zZSwgeW1heD1QQU0ucHJvcCtzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnR4dC5zeiksIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1sZWcudGl0bGUuc3opLCANCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIikpKw0KICBsYWJzKHg9IlNpdGUiLCB5PSJQaG90b2NoZW1pY2FsIEVmZmljaWVuY3kgUmV0ZW50aW9uIiwgY29sb3VyPSJTaXRlIikrDQogIHlsaW0oMC42LCAxKSsNCiAgYW5ub3RhdGUoInRleHQiLCB4PTEuNSwgeT0xLCBsYWJlbD0iKiIsIHNpemU9c2lnLnN6LCBmb250ZmFjZT0iYm9sZCIpOyBJTl9Ub2xQQU0ucGxvdA0KYGBgDQoNCg0KIyBUb2xlcmFuY2UgYWZ0ZXIgVHJhbnNwbGFudA0KDQoNCiMjIyBUUDENCmBgYHtyfQ0KIyNTdWJzZXQgVGltZXBvaW50IDENClRoZXJtX1RQMTwtc3Vic2V0KFRoZXJtX0gsIFRpbWVQPT0iVFAxIikNCmBgYA0KDQoNCiMjIyMgU3ltYmlvbnRzDQpgYGB7cn0NCiNDaGVjayBub3JtYWxpdHkNCmhpc3QoVGhlcm1fVFAxJFN5bS5wcm9wKQ0Kc2hhcGlyby50ZXN0KFRoZXJtX1RQMSRTeW0ucHJvcCkNCiNOb3Qgbm9ybWFsDQoNCmhpc3QobG9nKFRoZXJtX1RQMSRTeW0ucHJvcCsxKSkNCnNoYXBpcm8udGVzdChsb2coVGhlcm1fVFAxJFN5bS5wcm9wKzEpKQ0KIyNTdGlsbCBub3Qgbm9ybWFsIGJ1dCBsZXNzIHNrZXdlZA0KDQojI01vZGVsIHdpdGggbG9nICsxIHRyYW5zZm9ybWF0aW9uDQojRnVuY3Rpb24gb2YgU2l0ZSBhbmQgT3JpZ2luLCB3aXRoIEdlbm90eXBlIGFzIGEgUmFuZG9tIGVmZmVjdA0KI0ludGVyYWN0aW9uIGJldHdlZW4gU2l0ZSBhbmQgT3JpZ2luDQpUb2xfU3ltLmxtZV9UUDE8LWxtZXIobG9nKFN5bS5wcm9wKzEpfk9yaWdpbipTaXRlKygxfEdlbm90eXBlKSwgZGF0YT1UaGVybV9UUDEpDQoNCiMjQ2hlY2sgcmVzaWR1YWxzDQpUb2xfU3ltLmxtZV9yZXNfVFAxIDwtIHNpbXVsYXRlUmVzaWR1YWxzKGZpdHRlZE1vZGVsID0gVG9sX1N5bS5sbWVfVFAxLCBwbG90ID0gRikNCnBsb3QoVG9sX1N5bS5sbWVfcmVzX1RQMSkNCg0KIyNNb2RlbCByZXN1bHRzDQpzdW1tYXJ5KFRvbF9TeW0ubG1lX1RQMSkNCg0KZXRhX3NxdWFyZWQoVG9sX1N5bS5sbWVfVFAxKQ0KDQpgYGANCk5vdCBub3JtYWwsIGJ1dCBtb2RlbCByZXNpZHVhbHMgYXJlIE9LLg0KDQoNCkVmZmVjdCBzaXplIG9mIE9yaWdpbiBmb3IgZWFjaCBTaXRlDQpgYGB7cn0NCiMjS0wNClRvbF9TeW0ubG1lX1RQMV9LTDwtbG1lcihsb2coU3ltLnByb3ArMSl+T3JpZ2luKygxfEdlbm90eXBlKSwgZGF0YT1UaGVybV9UUDFbd2hpY2goVGhlcm1fVFAxJFNpdGU9PSJLTCIpLF0pDQpzdW1tYXJ5KFRvbF9TeW0ubG1lX1RQMV9LTCkNCmV0YV9zcXVhcmVkKFRvbF9TeW0ubG1lX1RQMV9LTCkNCg0KDQojI1NTDQpUb2xfU3ltLmxtZV9UUDFfU1M8LWxtZXIobG9nKFN5bS5wcm9wKzEpfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9VGhlcm1fVFAxW3doaWNoKFRoZXJtX1RQMSRTaXRlPT0iU1MiKSxdKQ0Kc3VtbWFyeShUb2xfU3ltLmxtZV9UUDFfU1MpDQpldGFfc3F1YXJlZChUb2xfU3ltLmxtZV9UUDFfU1MpDQoNCmBgYA0KDQoNCmBgYHtyIFBsb3QgU3ltYmlvbnQgUmV0ZW50aW9uIFRQMX0NCiMjU3VtbWFyeSBzdGF0aXN0aWNzIGJ5IFNpdGUgYW5kIE9yaWdpbg0KVFAxX1RvbFN5bS5zdW08LXN1bW1hcnlTRShUaGVybV9UUDEsIG1lYXN1cmV2YXI9IlN5bS5wcm9wIiwgZ3JvdXB2YXJzPWMoIlNpdGUiLCAiT3JpZ2luIiwgIlNpdGUuT3JpZyIpLCBuYS5ybT1UUlVFKQ0KDQojI1Bsb3QgQXZlcmFnZSBTeW1iaW9udCBSZXRlbnRpb24gYWNyb3NzIFRyZWF0bWVudHMNClRQMV9Ub2xTeW0ucGxvdDwtZ2dwbG90KFRQMV9Ub2xTeW0uc3VtLCBhZXMoeD1TaXRlLCB5PVN5bS5wcm9wLCBjb2xvdXI9U2l0ZS5PcmlnKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9T3JpZy5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49U3ltLnByb3Atc2UsIHltYXg9U3ltLnByb3Arc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpKSsNCiAgbGFicyh4PSJTaXRlIGFuZCBPcmlnaW4iLCB5PSJTeW1iaW9udCBSZXRlbnRpb24iLCBjb2xvdXI9Ik9yaWdpbiIpKw0KICB5bGltKDAsIDEpKw0KICBhbm5vdGF0ZSgidGV4dCIsIHg9MSwgeT0wLjc1LCBsYWJlbD0iKiIsIHNpemU9c2lnLnN6LCBmb250ZmFjZT0iYm9sZCIpOyBUUDFfVG9sU3ltLnBsb3QNCmBgYA0KDQoNCiMjIyMgQ2hsb3JvcGh5bGwNCmBgYHtyfQ0KI0NoZWNrIG5vcm1hbGl0eQ0KaGlzdChUaGVybV9UUDEkQ2hsLnByb3ApDQpzaGFwaXJvLnRlc3QoVGhlcm1fVFAxJENobC5wcm9wKQ0KI05vdCBub3JtYWwNCg0KaGlzdChsb2coVGhlcm1fVFAxJENobC5wcm9wKzEpKQ0Kc2hhcGlyby50ZXN0KGxvZyhUaGVybV9UUDEkQ2hsLnByb3ArMSkpDQojI1N0aWxsIG5vdCBub3JtYWwgYnV0IGxlc3Mgc2tld2VkDQoNCiMjTW9kZWwgd2l0aCBsb2cgKzEgdHJhbnNmb3JtYXRpb24NCiNGdW5jdGlvbiBvZiBTaXRlIGFuZCBPcmlnaW4sIHdpdGggR2Vub3R5cGUgYXMgYSBSYW5kb20gZWZmZWN0DQojSW50ZXJhY3Rpb24gYmV0d2VlbiBTaXRlIGFuZCBPcmlnaW4NClRvbF9DaGwubG1lX1RQMTwtbG1lcihsb2coQ2hsLnByb3ArMSl+T3JpZ2luKlNpdGUrKDF8R2Vub3R5cGUpLCBkYXRhPVRoZXJtX1RQMSkNCg0KIyNDaGVjayByZXNpZHVhbHMNClRvbF9DaGwubG1lX3Jlc19UUDEgPC0gc2ltdWxhdGVSZXNpZHVhbHMoZml0dGVkTW9kZWwgPSBUb2xfQ2hsLmxtZV9UUDEsIHBsb3QgPSBGKQ0KcGxvdChUb2xfQ2hsLmxtZV9yZXNfVFAxKQ0KDQojI01vZGVsIHJlc3VsdHMNCnN1bW1hcnkoVG9sX0NobC5sbWVfVFAxKQ0KDQpldGFfc3F1YXJlZChUb2xfQ2hsLmxtZV9UUDEpDQoNCmBgYA0KDQoNCkVmZmVjdCBzaXplIG9mIE9yaWdpbiBmb3IgZWFjaCBTaXRlDQpgYGB7cn0NCiMjS0wNClRvbF9DaGwubG1lX1RQMV9LTDwtbG1lcihsb2coQ2hsLnByb3ArMSl+T3JpZ2luKygxfEdlbm90eXBlKSwgZGF0YT1UaGVybV9UUDFbd2hpY2goVGhlcm1fVFAxJFNpdGU9PSJLTCIpLF0pDQpzdW1tYXJ5KFRvbF9DaGwubG1lX1RQMV9LTCkNCmV0YV9zcXVhcmVkKFRvbF9DaGwubG1lX1RQMV9LTCkNCg0KDQojI1NTDQpUb2xfQ2hsLmxtZV9UUDFfU1M8LWxtZXIobG9nKENobC5wcm9wKzEpfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9VGhlcm1fVFAxW3doaWNoKFRoZXJtX1RQMSRTaXRlPT0iU1MiKSxdKQ0Kc3VtbWFyeShUb2xfQ2hsLmxtZV9UUDFfU1MpDQpldGFfc3F1YXJlZChUb2xfQ2hsLmxtZV9UUDFfU1MpDQoNCmBgYA0KDQoNCmBgYHtyIFBsb3QgQ2hsb3JvcGh5bGwgUmV0ZW50aW9uIFRQMX0NCiMjU3VtbWFyeSBzdGF0aXN0aWNzIGJ5IFNpdGUgYW5kIE9yaWdpbg0KVFAxX1RvbENobC5zdW08LXN1bW1hcnlTRShUaGVybV9UUDEsIG1lYXN1cmV2YXI9IkNobC5wcm9wIiwgZ3JvdXB2YXJzPWMoIlNpdGUiLCAiT3JpZ2luIiwgIlNpdGUuT3JpZyIpLCBuYS5ybT1UUlVFKQ0KDQojI1Bsb3QgQXZlcmFnZSBDaGxvcm9waHlsbCBSZXRlbnRpb24gYWNyb3NzIFRyZWF0bWVudHMNClRQMV9Ub2xDaGwucGxvdDwtZ2dwbG90KFRQMV9Ub2xDaGwuc3VtLCBhZXMoeD1TaXRlLCB5PUNobC5wcm9wLCBjb2xvdXI9U2l0ZS5PcmlnKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9T3JpZy5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49Q2hsLnByb3Atc2UsIHltYXg9Q2hsLnByb3Arc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpKSsNCiAgbGFicyh4PSJTaXRlIGFuZCBPcmlnaW4iLCB5PSJDaGxvcm9waHlsbCBSZXRlbnRpb24iLCBjb2xvdXI9Ik9yaWdpbiIpKw0KICB5bGltKDAsIDAuMzUpOyBUUDFfVG9sQ2hsLnBsb3QNCmBgYA0KDQoNCiMjIyMgRnZGbQ0KYGBge3J9DQojQ2hlY2sgbm9ybWFsaXR5DQpoaXN0KFRoZXJtX1RQMSRQQU0ucHJvcCkNCnNoYXBpcm8udGVzdChUaGVybV9UUDEkUEFNLnByb3ApDQojTm90IG5vcm1hbA0KDQpoaXN0KGxvZyhUaGVybV9UUDEkUEFNLnByb3ArMSkpDQpzaGFwaXJvLnRlc3QobG9nKFRoZXJtX1RQMSRQQU0ucHJvcCsxKSkNCiMjU3RpbGwgbm90IG5vcm1hbA0KDQojI01vZGVsDQojRnVuY3Rpb24gb2YgU2l0ZSBhbmQgT3JpZ2luLCB3aXRoIEdlbm90eXBlIGFzIGEgUmFuZG9tIGVmZmVjdA0KI0ludGVyYWN0aW9uIGJldHdlZW4gU2l0ZSBhbmQgT3JpZ2luDQpUb2xfUEFNLmxtZV9UUDE8LWxtZXIoUEFNLnByb3B+T3JpZ2luKlNpdGUrKDF8R2Vub3R5cGUpLCBkYXRhPVRoZXJtX1RQMSkNCg0KIyNDaGVjayByZXNpZHVhbHMNClRvbF9QQU0ubG1lX3Jlc19UUDEgPC0gc2ltdWxhdGVSZXNpZHVhbHMoZml0dGVkTW9kZWwgPSBUb2xfUEFNLmxtZV9UUDEsIHBsb3QgPSBGKQ0KcGxvdChUb2xfUEFNLmxtZV9yZXNfVFAxKQ0KDQojI01vZGVsIHJlc3VsdHMNCnN1bW1hcnkoVG9sX1BBTS5sbWVfVFAxKQ0KDQpldGFfc3F1YXJlZChUb2xfUEFNLmxtZV9UUDEpDQoNCmBgYA0KTm90IG5vcm1hbCwgYnV0IG1vZGVsIHJlc2lkdWFscyBhcmUgT0suDQoNCg0KRWZmZWN0IHNpemUgb2YgT3JpZ2luIGZvciBlYWNoIFNpdGUNCmBgYHtyfQ0KIyNLTA0KVG9sX1BBTS5sbWVfVFAxX0tMPC1sbWVyKFBBTS5wcm9wfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9VGhlcm1fVFAxW3doaWNoKFRoZXJtX1RQMSRTaXRlPT0iS0wiKSxdKQ0Kc3VtbWFyeShUb2xfUEFNLmxtZV9UUDFfS0wpDQpldGFfc3F1YXJlZChUb2xfUEFNLmxtZV9UUDFfS0wpDQoNCg0KIyNTUw0KVG9sX1BBTS5sbWVfVFAxX1NTPC1sbWVyKFBBTS5wcm9wfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9VGhlcm1fVFAxW3doaWNoKFRoZXJtX1RQMSRTaXRlPT0iU1MiKSxdKQ0Kc3VtbWFyeShUb2xfUEFNLmxtZV9UUDFfU1MpDQpldGFfc3F1YXJlZChUb2xfUEFNLmxtZV9UUDFfU1MpDQoNCmBgYA0KDQoNCmBgYHtyIFBsb3QgRnZGbSBSZXRlbnRpb24gVFAxfQ0KIyNTdW1tYXJ5IHN0YXRpc3RpY3MgYnkgU2l0ZSBhbmQgT3JpZ2luDQpUUDFfVG9sUEFNLnN1bTwtc3VtbWFyeVNFKFRoZXJtX1RQMSwgbWVhc3VyZXZhcj0iUEFNLnByb3AiLCBncm91cHZhcnM9YygiU2l0ZSIsICJPcmlnaW4iLCAiU2l0ZS5PcmlnIiksIG5hLnJtPVRSVUUpDQoNCiMjUGxvdCBBdmVyYWdlIEZ2Rm0gUmV0ZW50aW9uIGFjcm9zcyBUcmVhdG1lbnRzDQpUUDFfVG9sUEFNLnBsb3Q8LWdncGxvdChUUDFfVG9sUEFNLnN1bSwgYWVzKHg9U2l0ZSwgeT1QQU0ucHJvcCwgY29sb3VyPVNpdGUuT3JpZykpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPVBBTS5wcm9wLXNlLCB5bWF4PVBBTS5wcm9wK3NlKSwgd2lkdGg9Y2FwLnN6LCBsaW5ld2lkdGg9YmFyLnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSArDQogIGdlb21fcG9pbnQoc2l6ZT1wb2ludC5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIA0KICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT1sZWcudHh0LnN6KSwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPWxlZy50aXRsZS5zeiksIA0KICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiYmxhY2siKSkrDQogIGxhYnMoeD0iU2l0ZSBhbmQgT3JpZ2luIiwgeT0iUGhvdG9jaGVtaWNhbCBFZmZpY2llbmN5IFJldGVudGlvbiIsIGNvbG91cj0iT3JpZ2luIikrDQogIHlsaW0oMC42LCAxKSsNCiAgYW5ub3RhdGUoInRleHQiLCB4PTEsIHk9MSwgbGFiZWw9IioqIiwgc2l6ZT1zaWcuc3osIGZvbnRmYWNlPSJib2xkIik7IFRQMV9Ub2xQQU0ucGxvdA0KYGBgDQoNCg0KIyMjIFRQMg0KYGBge3J9DQojI1N1YnNldCBUaW1lcG9pbnQgMg0KVGhlcm1fVFAyPC1zdWJzZXQoVGhlcm1fSCwgVGltZVA9PSJUUDIiKQ0KYGBgDQoNCg0KIyMjIyBTeW1iaW9udHMNCmBgYHtyfQ0KI0NoZWNrIG5vcm1hbGl0eQ0KaGlzdChUaGVybV9UUDIkU3ltLnByb3ApDQpzaGFwaXJvLnRlc3QoVGhlcm1fVFAyJFN5bS5wcm9wKQ0KI05vdCBub3JtYWwNCg0KaGlzdChsb2coVGhlcm1fVFAyJFN5bS5wcm9wKzEpKQ0Kc2hhcGlyby50ZXN0KGxvZyhUaGVybV9UUDIkU3ltLnByb3ArMSkpDQojI1N0aWxsIG5vdCBub3JtYWwNCg0KIyNNb2RlbA0KI0Z1bmN0aW9uIG9mIFNpdGUgYW5kIE9yaWdpbiwgd2l0aCBHZW5vdHlwZSBhcyBhIFJhbmRvbSBlZmZlY3QNCiNJbnRlcmFjdGlvbiBiZXR3ZWVuIFNpdGUgYW5kIE9yaWdpbg0KVG9sX1N5bS5sbWVfVFAyPC1sbWVyKFN5bS5wcm9wfk9yaWdpbipTaXRlKygxfEdlbm90eXBlKSwgZGF0YT1UaGVybV9UUDIpDQoNCiMjQ2hlY2sgcmVzaWR1YWxzDQpUb2xfU3ltLmxtZV9yZXNfVFAyIDwtIHNpbXVsYXRlUmVzaWR1YWxzKGZpdHRlZE1vZGVsID0gVG9sX1N5bS5sbWVfVFAyLCBwbG90ID0gRikNCnBsb3QoVG9sX1N5bS5sbWVfcmVzX1RQMikNCg0KIyNNb2RlbCByZXN1bHRzDQpzdW1tYXJ5KFRvbF9TeW0ubG1lX1RQMikNCg0KZXRhX3NxdWFyZWQoVG9sX1N5bS5sbWVfVFAyKQ0KDQpgYGANCk5vdCBub3JtYWwsIGJ1dCBtb2RlbCByZXNpZHVhbHMgYXJlIE9LLg0KDQoNCkVmZmVjdCBzaXplIG9mIE9yaWdpbiBmb3IgZWFjaCBTaXRlDQpgYGB7cn0NCiMjS0wNClRvbF9TeW0ubG1lX1RQMl9LTDwtbG1lcihTeW0ucHJvcH5PcmlnaW4rKDF8R2Vub3R5cGUpLCBkYXRhPVRoZXJtX1RQMlt3aGljaChUaGVybV9UUDIkU2l0ZT09IktMIiksXSkNCnN1bW1hcnkoVG9sX1N5bS5sbWVfVFAyX0tMKQ0KZXRhX3NxdWFyZWQoVG9sX1N5bS5sbWVfVFAyX0tMKQ0KDQoNCiMjU1MNClRvbF9TeW0ubG1lX1RQMl9TUzwtbG1lcihTeW0ucHJvcH5PcmlnaW4rKDF8R2Vub3R5cGUpLCBkYXRhPVRoZXJtX1RQMlt3aGljaChUaGVybV9UUDIkU2l0ZT09IlNTIiksXSkNCnN1bW1hcnkoVG9sX1N5bS5sbWVfVFAyX1NTKQ0KZXRhX3NxdWFyZWQoVG9sX1N5bS5sbWVfVFAyX1NTKQ0KDQpgYGANCg0KDQpgYGB7ciBQbG90IFN5bWJpb250IFJldGVudGlvbiBUUDJ9DQojI1N1bW1hcnkgc3RhdGlzdGljcyBieSBTaXRlIGFuZCBPcmlnaW4NClRQMl9Ub2xTeW0uc3VtPC1zdW1tYXJ5U0UoVGhlcm1fVFAyLCBtZWFzdXJldmFyPSJTeW0ucHJvcCIsIGdyb3VwdmFycz1jKCJTaXRlIiwgIk9yaWdpbiIsICJTaXRlLk9yaWciKSwgbmEucm09VFJVRSkNCg0KIyNQbG90IEF2ZXJhZ2UgUmV0ZW50aW9uIGFjcm9zcyBUcmVhdG1lbnRzDQpUUDJfVG9sU3ltLnBsb3Q8LWdncGxvdChUUDJfVG9sU3ltLnN1bSwgYWVzKHg9U2l0ZSwgeT1TeW0ucHJvcCwgY29sb3VyPVNpdGUuT3JpZykpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPVN5bS5wcm9wLXNlLCB5bWF4PVN5bS5wcm9wK3NlKSwgd2lkdGg9Y2FwLnN6LCBsaW5ld2lkdGg9YmFyLnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSArDQogIGdlb21fcG9pbnQoc2l6ZT1wb2ludC5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIA0KICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT1sZWcudHh0LnN6KSwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPWxlZy50aXRsZS5zeiksIA0KICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiYmxhY2siKSkrDQogIGxhYnMoeD0iU2l0ZSBhbmQgT3JpZ2luIiwgeT0iU3ltYmlvbnQgUmV0ZW50aW9uIiwgY29sb3VyPSJPcmlnaW4iKSsNCiAgeWxpbSgwLCAxKTsgVFAyX1RvbFN5bS5wbG90DQpgYGANCg0KDQojIyMjIENobG9yb3BoeWxsDQpgYGB7cn0NCiNDaGVjayBub3JtYWxpdHkNCmhpc3QoVGhlcm1fVFAyJENobC5wcm9wKQ0Kc2hhcGlyby50ZXN0KFRoZXJtX1RQMiRDaGwucHJvcCkNCiNOb3JtYWwNCg0KIyNNb2RlbA0KI0Z1bmN0aW9uIG9mIFNpdGUgYW5kIE9yaWdpbiwgd2l0aCBHZW5vdHlwZSBhcyBhIFJhbmRvbSBlZmZlY3QNCiNJbnRlcmFjdGlvbiBiZXR3ZWVuIFNpdGUgYW5kIE9yaWdpbg0KVG9sX0NobC5sbWVfVFAyPC1sbWVyKENobC5wcm9wfk9yaWdpbipTaXRlKygxfEdlbm90eXBlKSwgZGF0YT1UaGVybV9UUDIpDQoNCiMjQ2hlY2sgcmVzaWR1YWxzDQpUb2xfQ2hsLmxtZV9yZXNfVFAyIDwtIHNpbXVsYXRlUmVzaWR1YWxzKGZpdHRlZE1vZGVsID0gVG9sX0NobC5sbWVfVFAyLCBwbG90ID0gRikNCnBsb3QoVG9sX0NobC5sbWVfcmVzX1RQMikNCg0KIyNNb2RlbCByZXN1bHRzDQpzdW1tYXJ5KFRvbF9DaGwubG1lX1RQMikNCg0KZXRhX3NxdWFyZWQoVG9sX0NobC5sbWVfVFAyKQ0KDQpgYGANCg0KDQpFZmZlY3Qgc2l6ZSBvZiBPcmlnaW4gZm9yIGVhY2ggU2l0ZQ0KYGBge3J9DQojI0tMDQpUb2xfQ2hsLmxtZV9UUDJfS0w8LWxtZXIoQ2hsLnByb3B+T3JpZ2luKygxfEdlbm90eXBlKSwgZGF0YT1UaGVybV9UUDJbd2hpY2goVGhlcm1fVFAyJFNpdGU9PSJLTCIpLF0pDQpzdW1tYXJ5KFRvbF9DaGwubG1lX1RQMl9LTCkNCmV0YV9zcXVhcmVkKFRvbF9DaGwubG1lX1RQMl9LTCkNCg0KDQojI1NTDQpUb2xfQ2hsLmxtZV9UUDJfU1M8LWxtZXIoQ2hsLnByb3B+T3JpZ2luKygxfEdlbm90eXBlKSwgZGF0YT1UaGVybV9UUDJbd2hpY2goVGhlcm1fVFAyJFNpdGU9PSJTUyIpLF0pDQpzdW1tYXJ5KFRvbF9DaGwubG1lX1RQMl9TUykNCmV0YV9zcXVhcmVkKFRvbF9DaGwubG1lX1RQMl9TUykNCg0KYGBgDQoNCg0KYGBge3IgUGxvdCBDaGxvcm9waHlsbCBSZXRlbnRpb24gVFAyfQ0KIyNTdW1tYXJ5IHN0YXRpc3RpY3MgYnkgU2l0ZSBhbmQgT3JpZ2luDQpUUDJfVG9sQ2hsLnN1bTwtc3VtbWFyeVNFKFRoZXJtX1RQMiwgbWVhc3VyZXZhcj0iQ2hsLnByb3AiLCBncm91cHZhcnM9YygiU2l0ZSIsICJPcmlnaW4iLCAiU2l0ZS5PcmlnIiksIG5hLnJtPVRSVUUpDQoNCiMjUGxvdCBBdmVyYWdlIFJldGVudGlvbiBhY3Jvc3MgVHJlYXRtZW50cw0KVFAyX1RvbENobC5wbG90PC1nZ3Bsb3QoVFAyX1RvbENobC5zdW0sIGFlcyh4PVNpdGUsIHk9Q2hsLnByb3AsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1DaGwucHJvcC1zZSwgeW1heD1DaGwucHJvcCtzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnR4dC5zeiksIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1sZWcudGl0bGUuc3opLCANCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIikpKw0KICBsYWJzKHg9IlNpdGUgYW5kIE9yaWdpbiIsIHk9IkNobG9yb3BoeWxsIFJldGVudGlvbiIsIGNvbG91cj0iT3JpZ2luIikrDQogIHlsaW0oMCwgMC4zNSk7IFRQMl9Ub2xDaGwucGxvdA0KYGBgDQoNCg0KIyMjIyBGdkZtDQpgYGB7cn0NCiNDaGVjayBub3JtYWxpdHkNCmhpc3QoVGhlcm1fVFAyJFBBTS5wcm9wKQ0Kc2hhcGlyby50ZXN0KFRoZXJtX1RQMiRQQU0ucHJvcCkNCiNOb3Qgbm9ybWFsDQoNCmhpc3QobG9nKFRoZXJtX1RQMiRQQU0ucHJvcCsxKSkNCnNoYXBpcm8udGVzdChsb2coVGhlcm1fVFAyJFBBTS5wcm9wKzEpKQ0KIyNTdGlsbCBub3Qgbm9ybWFsDQoNCiMjTW9kZWwNCiNGdW5jdGlvbiBvZiBTaXRlIGFuZCBPcmlnaW4sIHdpdGggR2Vub3R5cGUgYXMgYSBSYW5kb20gZWZmZWN0DQojSW50ZXJhY3Rpb24gYmV0d2VlbiBTaXRlIGFuZCBPcmlnaW4NClRvbF9QQU0ubG1lX1RQMjwtbG1lcihQQU0ucHJvcH5PcmlnaW4qU2l0ZSsoMXxHZW5vdHlwZSksIGRhdGE9VGhlcm1fVFAyKQ0KDQojI0NoZWNrIHJlc2lkdWFscw0KVG9sX1BBTS5sbWVfcmVzX1RQMiA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IFRvbF9QQU0ubG1lX1RQMiwgcGxvdCA9IEYpDQpwbG90KFRvbF9QQU0ubG1lX3Jlc19UUDIpDQoNCiMjTW9kZWwgcmVzdWx0cw0Kc3VtbWFyeShUb2xfUEFNLmxtZV9UUDIpDQoNCmV0YV9zcXVhcmVkKFRvbF9QQU0ubG1lX1RQMikNCg0KYGBgDQpOb3Qgbm9ybWFsLCBidXQgbW9kZWwgcmVzaWR1YWxzIGFyZSBPSy4NCg0KDQpFZmZlY3Qgc2l6ZSBvZiBPcmlnaW4gZm9yIGVhY2ggU2l0ZQ0KYGBge3J9DQojI0tMDQpUb2xfUEFNLmxtZV9UUDJfS0w8LWxtZXIoUEFNLnByb3B+T3JpZ2luKygxfEdlbm90eXBlKSwgZGF0YT1UaGVybV9UUDJbd2hpY2goVGhlcm1fVFAyJFNpdGU9PSJLTCIpLF0pDQpzdW1tYXJ5KFRvbF9QQU0ubG1lX1RQMl9LTCkNCmV0YV9zcXVhcmVkKFRvbF9QQU0ubG1lX1RQMl9LTCkNCg0KDQojI1NTDQpUb2xfUEFNLmxtZV9UUDJfU1M8LWxtZXIoUEFNLnByb3B+T3JpZ2luKygxfEdlbm90eXBlKSwgZGF0YT1UaGVybV9UUDJbd2hpY2goVGhlcm1fVFAyJFNpdGU9PSJTUyIpLF0pDQpzdW1tYXJ5KFRvbF9QQU0ubG1lX1RQMl9TUykNCmV0YV9zcXVhcmVkKFRvbF9QQU0ubG1lX1RQMl9TUykNCg0KYGBgDQoNCg0KYGBge3IgUGxvdCBGdkZtIFJldGVudGlvbiBUUDJ9DQojI1N1bW1hcnkgc3RhdGlzdGljcyBieSBTaXRlIGFuZCBPcmlnaW4NClRQMl9Ub2xQQU0uc3VtPC1zdW1tYXJ5U0UoVGhlcm1fVFAyLCBtZWFzdXJldmFyPSJQQU0ucHJvcCIsIGdyb3VwdmFycz1jKCJTaXRlIiwgIk9yaWdpbiIsICJTaXRlLk9yaWciKSwgbmEucm09VFJVRSkNCg0KIyNQbG90IEF2ZXJhZ2UgUmV0ZW50aW9uIGFjcm9zcyBUcmVhdG1lbnRzDQpUUDJfVG9sUEFNLnBsb3Q8LWdncGxvdChUUDJfVG9sUEFNLnN1bSwgYWVzKHg9U2l0ZSwgeT1QQU0ucHJvcCwgY29sb3VyPVNpdGUuT3JpZykpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPVBBTS5wcm9wLXNlLCB5bWF4PVBBTS5wcm9wK3NlKSwgd2lkdGg9Y2FwLnN6LCBsaW5ld2lkdGg9YmFyLnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSArDQogIGdlb21fcG9pbnQoc2l6ZT1wb2ludC5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIA0KICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT1sZWcudHh0LnN6KSwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPWxlZy50aXRsZS5zeiksIA0KICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiYmxhY2siKSkrDQogIGxhYnMoeD0iU2l0ZSBhbmQgT3JpZ2luIiwgeT0iUGhvdG9jaGVtaWNhbCBFZmZpY2llbmN5IFJldGVudGlvbiIsIGNvbG91cj0iT3JpZ2luIikrDQogIHlsaW0oMC42LCAxKSsNCiAgYW5ub3RhdGUoInRleHQiLCB4PTEsIHk9MSwgbGFiZWw9IioiLCBzaXplPXNpZy5zeiwgZm9udGZhY2U9ImJvbGQiKTsgVFAyX1RvbFBBTS5wbG90DQpgYGANCg0KDQojIyMgVFAzDQpgYGB7cn0NCiMjU3Vic2V0IFRpbWVwb2ludCAzDQpUaGVybV9UUDM8LXN1YnNldChUaGVybV9ILCBUaW1lUD09IlRQMyIpDQpgYGANCg0KDQojIyMjIFN5bWJpb250cw0KYGBge3J9DQojQ2hlY2sgbm9ybWFsaXR5DQpoaXN0KFRoZXJtX1RQMyRTeW0ucHJvcCkNCnNoYXBpcm8udGVzdChUaGVybV9UUDMkU3ltLnByb3ApDQojTm90IG5vcm1hbA0KDQpoaXN0KGxvZyhUaGVybV9UUDMkU3ltLnByb3ArMSkpDQpzaGFwaXJvLnRlc3QobG9nKFRoZXJtX1RQMyRTeW0ucHJvcCsxKSkNCiMjU3RpbGwgbm90IG5vcm1hbCBidXQgbGVzcyBza2V3ZWQNCg0KIyNNb2RlbCB3aXRoIGxvZyArMSB0cmFuc2Zvcm1hdGlvbg0KI0Z1bmN0aW9uIG9mIFNpdGUgYW5kIE9yaWdpbiwgd2l0aCBHZW5vdHlwZSBhcyBhIFJhbmRvbSBlZmZlY3QNCiNJbnRlcmFjdGlvbiBiZXR3ZWVuIFNpdGUgYW5kIE9yaWdpbg0KVG9sX1N5bS5sbWVfVFAzPC1sbWVyKGxvZyhTeW0ucHJvcCsxKX5PcmlnaW4qU2l0ZSsoMXxHZW5vdHlwZSksIGRhdGE9VGhlcm1fVFAzKQ0KDQojI0NoZWNrIHJlc2lkdWFscw0KVG9sX1N5bS5sbWVfcmVzX1RQMyA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IFRvbF9TeW0ubG1lX1RQMywgcGxvdCA9IEYpDQpwbG90KFRvbF9TeW0ubG1lX3Jlc19UUDMpDQoNCiMjTW9kZWwgcmVzdWx0cw0Kc3VtbWFyeShUb2xfU3ltLmxtZV9UUDMpDQoNCmV0YV9zcXVhcmVkKFRvbF9TeW0ubG1lX1RQMykNCg0KYGBgDQpOb3Qgbm9ybWFsLCBidXQgbW9kZWwgcmVzaWR1YWxzIGFyZSBPSy4NCg0KDQpFZmZlY3Qgc2l6ZSBvZiBPcmlnaW4gZm9yIGVhY2ggU2l0ZQ0KYGBge3J9DQojI0tMDQpUb2xfU3ltLmxtZV9UUDNfS0w8LWxtZXIobG9nKFN5bS5wcm9wKzEpfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9VGhlcm1fVFAzW3doaWNoKFRoZXJtX1RQMyRTaXRlPT0iS0wiKSxdKQ0Kc3VtbWFyeShUb2xfU3ltLmxtZV9UUDNfS0wpDQpldGFfc3F1YXJlZChUb2xfU3ltLmxtZV9UUDNfS0wpDQoNCg0KIyNTUw0KVG9sX1N5bS5sbWVfVFAzX1NTPC1sbWVyKGxvZyhTeW0ucHJvcCsxKX5PcmlnaW4rKDF8R2Vub3R5cGUpLCBkYXRhPVRoZXJtX1RQM1t3aGljaChUaGVybV9UUDMkU2l0ZT09IlNTIiksXSkNCnN1bW1hcnkoVG9sX1N5bS5sbWVfVFAzX1NTKQ0KZXRhX3NxdWFyZWQoVG9sX1N5bS5sbWVfVFAzX1NTKQ0KDQpgYGANCg0KDQpgYGB7ciBQbG90IFN5bWJpb250IFJldGVudGlvbiBUUDN9DQojI1N1bW1hcnkgc3RhdGlzdGljcyBieSBTaXRlIGFuZCBPcmlnaW4NClRQM19Ub2xTeW0uc3VtPC1zdW1tYXJ5U0UoVGhlcm1fVFAzLCBtZWFzdXJldmFyPSJTeW0ucHJvcCIsIGdyb3VwdmFycz1jKCJTaXRlIiwgIk9yaWdpbiIsICJTaXRlLk9yaWciKSwgbmEucm09VFJVRSkNCg0KIyNQbG90IEF2ZXJhZ2UgUmV0ZW50aW9uIGFjcm9zcyBUcmVhdG1lbnRzDQpUUDNfVG9sU3ltLnBsb3Q8LWdncGxvdChUUDNfVG9sU3ltLnN1bSwgYWVzKHg9U2l0ZSwgeT1TeW0ucHJvcCwgY29sb3VyPVNpdGUuT3JpZykpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPVN5bS5wcm9wLXNlLCB5bWF4PVN5bS5wcm9wK3NlKSwgd2lkdGg9Y2FwLnN6LCBsaW5ld2lkdGg9YmFyLnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSArDQogIGdlb21fcG9pbnQoc2l6ZT1wb2ludC5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIA0KICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT1sZWcudHh0LnN6KSwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPWxlZy50aXRsZS5zeiksIA0KICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiYmxhY2siKSkrDQogIGxhYnMoeD0iU2l0ZSBhbmQgT3JpZ2luIiwgeT0iU3ltYmlvbnQgUmV0ZW50aW9uIiwgY29sb3VyPSJPcmlnaW4iKSsNCiAgeWxpbSgwLCAxKTsgVFAzX1RvbFN5bS5wbG90DQpgYGANCg0KDQojIyMjIENobG9yb3BoeWxsDQpgYGB7cn0NCiNDaGVjayBub3JtYWxpdHkNCmhpc3QoVGhlcm1fVFAzJENobC5wcm9wKQ0Kc2hhcGlyby50ZXN0KFRoZXJtX1RQMyRDaGwucHJvcCkNCiNOb3Qgbm9ybWFsDQoNCmhpc3QobG9nKFRoZXJtX1RQMyRDaGwucHJvcCsxKSkNCnNoYXBpcm8udGVzdChsb2coVGhlcm1fVFAzJENobC5wcm9wKzEpKQ0KIyNTdGlsbCBub3Qgbm9ybWFsIGJ1dCBsZXNzIHNrZXdlZA0KDQojI01vZGVsIHdpdGggbG9nICsxIHRyYW5zZm9ybWF0aW9uDQojRnVuY3Rpb24gb2YgU2l0ZSBhbmQgT3JpZ2luLCB3aXRoIEdlbm90eXBlIGFzIGEgUmFuZG9tIGVmZmVjdA0KI0ludGVyYWN0aW9uIGJldHdlZW4gU2l0ZSBhbmQgT3JpZ2luDQpUb2xfQ2hsLmxtZV9UUDM8LWxtZXIobG9nKENobC5wcm9wKzEpfk9yaWdpbipTaXRlKygxfEdlbm90eXBlKSwgZGF0YT1UaGVybV9UUDMpDQoNCiMjQ2hlY2sgcmVzaWR1YWxzDQpUb2xfQ2hsLmxtZV9yZXNfVFAzIDwtIHNpbXVsYXRlUmVzaWR1YWxzKGZpdHRlZE1vZGVsID0gVG9sX0NobC5sbWVfVFAzLCBwbG90ID0gRikNCnBsb3QoVG9sX0NobC5sbWVfcmVzX1RQMykNCg0KIyNNb2RlbCByZXN1bHRzDQpzdW1tYXJ5KFRvbF9DaGwubG1lX1RQMykNCg0KZXRhX3NxdWFyZWQoVG9sX0NobC5sbWVfVFAzKQ0KDQpgYGANCk5vdCBub3JtYWwsIGJ1dCBtb2RlbCByZXNpZHVhbHMgYXJlIE9LLg0KDQoNCkVmZmVjdCBzaXplIG9mIE9yaWdpbiBmb3IgZWFjaCBTaXRlDQpgYGB7cn0NCiMjS0wNClRvbF9DaGwubG1lX1RQM19LTDwtbG1lcihsb2coQ2hsLnByb3ArMSl+T3JpZ2luKygxfEdlbm90eXBlKSwgZGF0YT1UaGVybV9UUDNbd2hpY2goVGhlcm1fVFAzJFNpdGU9PSJLTCIpLF0pDQpzdW1tYXJ5KFRvbF9DaGwubG1lX1RQM19LTCkNCmV0YV9zcXVhcmVkKFRvbF9DaGwubG1lX1RQM19LTCkNCg0KDQojI1NTDQpUb2xfQ2hsLmxtZV9UUDNfU1M8LWxtZXIobG9nKENobC5wcm9wKzEpfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9VGhlcm1fVFAzW3doaWNoKFRoZXJtX1RQMyRTaXRlPT0iU1MiKSxdKQ0Kc3VtbWFyeShUb2xfQ2hsLmxtZV9UUDNfU1MpDQpldGFfc3F1YXJlZChUb2xfQ2hsLmxtZV9UUDNfU1MpDQoNCmBgYA0KDQoNCmBgYHtyIFBsb3QgQ2hsb3JvcGh5bGwgUmV0ZW50aW9uIFRQM30NCiMjU3VtbWFyeSBzdGF0aXN0aWNzIGJ5IFNpdGUgYW5kIE9yaWdpbg0KVFAzX1RvbENobC5zdW08LXN1bW1hcnlTRShUaGVybV9UUDMsIG1lYXN1cmV2YXI9IkNobC5wcm9wIiwgZ3JvdXB2YXJzPWMoIlNpdGUiLCAiT3JpZ2luIiwgIlNpdGUuT3JpZyIpLCBuYS5ybT1UUlVFKQ0KDQojI1Bsb3QgQXZlcmFnZSBSZXRlbnRpb24gYWNyb3NzIFRyZWF0bWVudHMNClRQM19Ub2xDaGwucGxvdDwtZ2dwbG90KFRQM19Ub2xDaGwuc3VtLCBhZXMoeD1TaXRlLCB5PUNobC5wcm9wLCBjb2xvdXI9U2l0ZS5PcmlnKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9T3JpZy5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49Q2hsLnByb3Atc2UsIHltYXg9Q2hsLnByb3Arc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpKSsNCiAgbGFicyh4PSJTaXRlIGFuZCBPcmlnaW4iLCB5PSJDaGxvcm9waHlsbCBSZXRlbnRpb24iLCBjb2xvdXI9Ik9yaWdpbiIpKw0KICB5bGltKDAsIDEpOyBUUDNfVG9sQ2hsLnBsb3QNCmBgYA0KDQoNCiMjIyMgRnZGbQ0KYGBge3J9DQojQ2hlY2sgbm9ybWFsaXR5DQpoaXN0KFRoZXJtX1RQMyRQQU0ucHJvcCkNCnNoYXBpcm8udGVzdChUaGVybV9UUDMkUEFNLnByb3ApDQojTm9ybWFsDQoNCiMjTW9kZWwNCiNGdW5jdGlvbiBvZiBTaXRlIGFuZCBPcmlnaW4sIHdpdGggR2Vub3R5cGUgYXMgYSBSYW5kb20gZWZmZWN0DQojSW50ZXJhY3Rpb24gYmV0d2VlbiBTaXRlIGFuZCBPcmlnaW4NClRvbF9QQU0ubG1lX1RQMzwtbG1lcihQQU0ucHJvcH5PcmlnaW4qU2l0ZSsoMXxHZW5vdHlwZSksIGRhdGE9VGhlcm1fVFAzKQ0KDQojI0NoZWNrIHJlc2lkdWFscw0KVG9sX1BBTS5sbWVfcmVzX1RQMyA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IFRvbF9QQU0ubG1lX1RQMywgcGxvdCA9IEYpDQpwbG90KFRvbF9QQU0ubG1lX3Jlc19UUDMpDQoNCiMjTW9kZWwgcmVzdWx0cw0Kc3VtbWFyeShUb2xfUEFNLmxtZV9UUDMpDQoNCmV0YV9zcXVhcmVkKFRvbF9QQU0ubG1lX1RQMykNCg0KYGBgDQoNCg0KRWZmZWN0IHNpemUgb2YgT3JpZ2luIGZvciBlYWNoIFNpdGUNCmBgYHtyfQ0KIyNLTA0KVG9sX1BBTS5sbWVfVFAzX0tMPC1sbWVyKFBBTS5wcm9wfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9VGhlcm1fVFAzW3doaWNoKFRoZXJtX1RQMyRTaXRlPT0iS0wiKSxdKQ0Kc3VtbWFyeShUb2xfUEFNLmxtZV9UUDNfS0wpDQpldGFfc3F1YXJlZChUb2xfUEFNLmxtZV9UUDNfS0wpDQoNCg0KIyNTUw0KVG9sX1BBTS5sbWVfVFAzX1NTPC1sbWVyKFBBTS5wcm9wfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9VGhlcm1fVFAzW3doaWNoKFRoZXJtX1RQMyRTaXRlPT0iU1MiKSxdKQ0Kc3VtbWFyeShUb2xfUEFNLmxtZV9UUDNfU1MpDQpldGFfc3F1YXJlZChUb2xfUEFNLmxtZV9UUDNfU1MpDQoNCmBgYA0KDQoNCmBgYHtyIFBsb3QgRnZGbSBSZXRlbnRpb24gVFAzfQ0KIyNTdW1tYXJ5IHN0YXRpc3RpY3MgYnkgU2l0ZSBhbmQgT3JpZ2luDQpUUDNfVG9sUEFNLnN1bTwtc3VtbWFyeVNFKFRoZXJtX1RQMywgbWVhc3VyZXZhcj0iUEFNLnByb3AiLCBncm91cHZhcnM9YygiU2l0ZSIsICJPcmlnaW4iLCAiU2l0ZS5PcmlnIiksIG5hLnJtPVRSVUUpDQoNCiMjUGxvdCBBdmVyYWdlIFJldGVudGlvbiBhY3Jvc3MgVHJlYXRtZW50cw0KVFAzX1RvbFBBTS5wbG90PC1nZ3Bsb3QoVFAzX1RvbFBBTS5zdW0sIGFlcyh4PVNpdGUsIHk9UEFNLnByb3AsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1QQU0ucHJvcC1zZSwgeW1heD1QQU0ucHJvcCtzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnR4dC5zeiksIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1sZWcudGl0bGUuc3opLCANCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIikpKw0KICBsYWJzKHg9IlNpdGUgYW5kIE9yaWdpbiIsIHk9IlBob3RvY2hlbWljYWwgRWZmaWNpZW5jeSBSZXRlbnRpb24iLCBjb2xvdXI9Ik9yaWdpbiIpKw0KICB5bGltKDAuNywgMSk7IFRQM19Ub2xQQU0ucGxvdA0KYGBgDQoNCg0KIyMjIFRQNA0KYGBge3J9DQojI1N1YnNldCBUaW1lcG9pbnQgNA0KVGhlcm1fVFA0PC1zdWJzZXQoVGhlcm1fSCwgVGltZVA9PSJUUDQiKQ0KYGBgDQoNCg0KIyMjIyBTeW1iaW9udHMNCmBgYHtyfQ0KI0NoZWNrIG5vcm1hbGl0eQ0KaGlzdChUaGVybV9UUDQkU3ltLnByb3ApDQpzaGFwaXJvLnRlc3QoVGhlcm1fVFA0JFN5bS5wcm9wKQ0KI05vdCBub3JtYWwNCg0KaGlzdChsb2coVGhlcm1fVFA0JFN5bS5wcm9wKzEpKQ0Kc2hhcGlyby50ZXN0KGxvZyhUaGVybV9UUDQkU3ltLnByb3ArMSkpDQojTm9ybWFsDQoNCiMjTW9kZWwgd2l0aCBsb2cgKzEgdHJhbnNmb3JtYXRpb24NCiNGdW5jdGlvbiBvZiBTaXRlIGFuZCBPcmlnaW4sIHdpdGggR2Vub3R5cGUgYXMgYSBSYW5kb20gZWZmZWN0DQojSW50ZXJhY3Rpb24gYmV0d2VlbiBTaXRlIGFuZCBPcmlnaW4NClRvbF9TeW0ubG1lX1RQNDwtbG1lcihsb2coU3ltLnByb3ArMSl+T3JpZ2luKlNpdGUrKDF8R2Vub3R5cGUpLCBkYXRhPVRoZXJtX1RQNCkNCg0KIyNDaGVjayByZXNpZHVhbHMNClRvbF9TeW0ubG1lX3Jlc19UUDQgPC0gc2ltdWxhdGVSZXNpZHVhbHMoZml0dGVkTW9kZWwgPSBUb2xfU3ltLmxtZV9UUDQsIHBsb3QgPSBGKQ0KcGxvdChUb2xfU3ltLmxtZV9yZXNfVFA0KQ0KDQojI01vZGVsIHJlc3VsdHMNCnN1bW1hcnkoVG9sX1N5bS5sbWVfVFA0KQ0KDQpldGFfc3F1YXJlZChUb2xfU3ltLmxtZV9UUDQpDQoNCmBgYA0KDQoNCkVmZmVjdCBzaXplIG9mIE9yaWdpbiBmb3IgZWFjaCBTaXRlDQpgYGB7cn0NCiMjS0wNClRvbF9TeW0ubG1lX1RQNF9LTDwtbG1lcihsb2coU3ltLnByb3ArMSl+T3JpZ2luKygxfEdlbm90eXBlKSwgZGF0YT1UaGVybV9UUDRbd2hpY2goVGhlcm1fVFA0JFNpdGU9PSJLTCIpLF0pDQpzdW1tYXJ5KFRvbF9TeW0ubG1lX1RQNF9LTCkNCmV0YV9zcXVhcmVkKFRvbF9TeW0ubG1lX1RQNF9LTCkNCg0KDQojI1NTDQpUb2xfU3ltLmxtZV9UUDRfU1M8LWxtZXIobG9nKFN5bS5wcm9wKzEpfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9VGhlcm1fVFA0W3doaWNoKFRoZXJtX1RQNCRTaXRlPT0iU1MiKSxdKQ0Kc3VtbWFyeShUb2xfU3ltLmxtZV9UUDRfU1MpDQpldGFfc3F1YXJlZChUb2xfU3ltLmxtZV9UUDRfU1MpDQoNCmBgYA0KDQoNCmBgYHtyIFBsb3QgU3ltYmlvbnQgUmV0ZW50aW9uIFRQNH0NCiMjU3VtbWFyeSBzdGF0aXN0aWNzIGJ5IFNpdGUgYW5kIE9yaWdpbg0KVFA0X1RvbFN5bS5zdW08LXN1bW1hcnlTRShUaGVybV9UUDQsIG1lYXN1cmV2YXI9IlN5bS5wcm9wIiwgZ3JvdXB2YXJzPWMoIlNpdGUiLCAiT3JpZ2luIiwgIlNpdGUuT3JpZyIpLCBuYS5ybT1UUlVFKQ0KDQojI1Bsb3QgQXZlcmFnZSBSZXRlbnRpb24gYWNyb3NzIFRyZWF0bWVudHMNClRQNF9Ub2xTeW0ucGxvdDwtZ2dwbG90KFRQNF9Ub2xTeW0uc3VtLCBhZXMoeD1TaXRlLCB5PVN5bS5wcm9wLCBjb2xvdXI9U2l0ZS5PcmlnKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9T3JpZy5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49U3ltLnByb3Atc2UsIHltYXg9U3ltLnByb3Arc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpKSsNCiAgbGFicyh4PSJTaXRlIGFuZCBPcmlnaW4iLCB5PSJTeW1iaW9udCBSZXRlbnRpb24iLCBjb2xvdXI9Ik9yaWdpbiIpKw0KICB5bGltKDAsIDEpOyBUUDRfVG9sU3ltLnBsb3QNCmBgYA0KDQoNCiMjIyMgQ2hsb3JvcGh5bGwNCmBgYHtyfQ0KI0NoZWNrIG5vcm1hbGl0eQ0KaGlzdChUaGVybV9UUDQkQ2hsLnByb3ApDQpzaGFwaXJvLnRlc3QoVGhlcm1fVFA0JENobC5wcm9wKQ0KI05vdCBub3JtYWwNCg0KaGlzdChsb2coVGhlcm1fVFA0JENobC5wcm9wKzEpKQ0Kc2hhcGlyby50ZXN0KGxvZyhUaGVybV9UUDQkQ2hsLnByb3ArMSkpDQojI05lYXJseSBub3JtYWwNCg0KIyNNb2RlbCB3aXRoIGxvZyArMSB0cmFuc2Zvcm1hdGlvbg0KI0Z1bmN0aW9uIG9mIFNpdGUgYW5kIE9yaWdpbiwgd2l0aCBHZW5vdHlwZSBhcyBhIFJhbmRvbSBlZmZlY3QNCiNJbnRlcmFjdGlvbiBiZXR3ZWVuIFNpdGUgYW5kIE9yaWdpbg0KVG9sX0NobC5sbWVfVFA0PC1sbWVyKGxvZyhDaGwucHJvcCsxKX5PcmlnaW4qU2l0ZSsoMXxHZW5vdHlwZSksIGRhdGE9VGhlcm1fVFA0KQ0KDQojI0NoZWNrIHJlc2lkdWFscw0KVG9sX0NobC5sbWVfcmVzX1RQNCA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IFRvbF9DaGwubG1lX1RQNCwgcGxvdCA9IEYpDQpwbG90KFRvbF9DaGwubG1lX3Jlc19UUDQpDQoNCiMjTW9kZWwgcmVzdWx0cw0Kc3VtbWFyeShUb2xfQ2hsLmxtZV9UUDQpDQoNCmV0YV9zcXVhcmVkKFRvbF9DaGwubG1lX1RQNCkNCg0KYGBgDQoNCg0KRWZmZWN0IHNpemUgb2YgT3JpZ2luIGZvciBlYWNoIFNpdGUNCmBgYHtyfQ0KIyNLTA0KVG9sX0NobC5sbWVfVFA0X0tMPC1sbWVyKGxvZyhDaGwucHJvcCsxKX5PcmlnaW4rKDF8R2Vub3R5cGUpLCBkYXRhPVRoZXJtX1RQNFt3aGljaChUaGVybV9UUDQkU2l0ZT09IktMIiksXSkNCnN1bW1hcnkoVG9sX0NobC5sbWVfVFA0X0tMKQ0KZXRhX3NxdWFyZWQoVG9sX0NobC5sbWVfVFA0X0tMKQ0KDQoNCiMjU1MNClRvbF9DaGwubG1lX1RQNF9TUzwtbG1lcihsb2coQ2hsLnByb3ArMSl+T3JpZ2luKygxfEdlbm90eXBlKSwgZGF0YT1UaGVybV9UUDRbd2hpY2goVGhlcm1fVFA0JFNpdGU9PSJTUyIpLF0pDQpzdW1tYXJ5KFRvbF9DaGwubG1lX1RQNF9TUykNCmV0YV9zcXVhcmVkKFRvbF9DaGwubG1lX1RQNF9TUykNCg0KYGBgDQoNCg0KYGBge3IgUGxvdCBDaGxvcm9waHlsbCBSZXRlbnRpb24gVFA0fQ0KIyNTdW1tYXJ5IHN0YXRpc3RpY3MgYnkgU2l0ZSBhbmQgT3JpZ2luDQpUUDRfVG9sQ2hsLnN1bTwtc3VtbWFyeVNFKFRoZXJtX1RQNCwgbWVhc3VyZXZhcj0iQ2hsLnByb3AiLCBncm91cHZhcnM9YygiU2l0ZSIsICJPcmlnaW4iLCAiU2l0ZS5PcmlnIiksIG5hLnJtPVRSVUUpDQoNCiMjUGxvdCBBdmVyYWdlIFJldGVudGlvbiBhY3Jvc3MgVHJlYXRtZW50cw0KVFA0X1RvbENobC5wbG90PC1nZ3Bsb3QoVFA0X1RvbENobC5zdW0sIGFlcyh4PVNpdGUsIHk9Q2hsLnByb3AsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1DaGwucHJvcC1zZSwgeW1heD1DaGwucHJvcCtzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnR4dC5zeiksIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1sZWcudGl0bGUuc3opLCANCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIikpKw0KICBsYWJzKHg9IlNpdGUgYW5kIE9yaWdpbiIsIHk9IkNobG9yb3BoeWxsIFJldGVudGlvbiIsIGNvbG91cj0iT3JpZ2luIikrDQogIHlsaW0oMCwgMC4zNSk7IFRQNF9Ub2xDaGwucGxvdA0KYGBgDQoNCg0KIyMjIyBGdkZtDQpgYGB7cn0NCiNDaGVjayBub3JtYWxpdHkNCmhpc3QoVGhlcm1fVFA0JFBBTS5wcm9wKQ0Kc2hhcGlyby50ZXN0KFRoZXJtX1RQNCRQQU0ucHJvcCkNCiNOb3Qgbm9ybWFsDQoNCmhpc3QobG9nKFRoZXJtX1RQNCRQQU0ucHJvcCsxKSkNCnNoYXBpcm8udGVzdChsb2coVGhlcm1fVFA0JFBBTS5wcm9wKzEpKQ0KIyNTdGlsbCBub3Qgbm9ybWFsDQoNCiMjTW9kZWwNCiNGdW5jdGlvbiBvZiBTaXRlIGFuZCBPcmlnaW4sIHdpdGggR2Vub3R5cGUgYXMgYSBSYW5kb20gZWZmZWN0DQojSW50ZXJhY3Rpb24gYmV0d2VlbiBTaXRlIGFuZCBPcmlnaW4NClRvbF9QQU0ubG1lX1RQNDwtbG1lcihQQU0ucHJvcH5PcmlnaW4qU2l0ZSsoMXxHZW5vdHlwZSksIGRhdGE9VGhlcm1fVFA0KQ0KDQojI0NoZWNrIHJlc2lkdWFscw0KVG9sX1BBTS5sbWVfcmVzX1RQNCA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IFRvbF9QQU0ubG1lX1RQNCwgcGxvdCA9IEYpDQpwbG90KFRvbF9QQU0ubG1lX3Jlc19UUDQpDQoNCiMjTW9kZWwgcmVzdWx0cw0Kc3VtbWFyeShUb2xfUEFNLmxtZV9UUDQpDQoNCmV0YV9zcXVhcmVkKFRvbF9QQU0ubG1lX1RQNCkNCg0KYGBgDQoNCg0KRWZmZWN0IHNpemUgb2YgT3JpZ2luIGZvciBlYWNoIFNpdGUNCmBgYHtyfQ0KIyNLTA0KVG9sX1BBTS5sbWVfVFA0X0tMPC1sbWVyKFBBTS5wcm9wfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9VGhlcm1fVFA0W3doaWNoKFRoZXJtX1RQNCRTaXRlPT0iS0wiKSxdKQ0Kc3VtbWFyeShUb2xfUEFNLmxtZV9UUDRfS0wpDQpldGFfc3F1YXJlZChUb2xfUEFNLmxtZV9UUDRfS0wpDQoNCg0KIyNTUw0KVG9sX1BBTS5sbWVfVFA0X1NTPC1sbWVyKFBBTS5wcm9wfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9VGhlcm1fVFA0W3doaWNoKFRoZXJtX1RQNCRTaXRlPT0iU1MiKSxdKQ0Kc3VtbWFyeShUb2xfUEFNLmxtZV9UUDRfU1MpDQpldGFfc3F1YXJlZChUb2xfUEFNLmxtZV9UUDRfU1MpDQoNCmBgYA0KDQoNCmBgYHtyIFBsb3QgRnZGbSBSZXRlbnRpb24gVFA0fQ0KIyNTdW1tYXJ5IHN0YXRpc3RpY3MgYnkgU2l0ZSBhbmQgT3JpZ2luDQpUUDRfVG9sUEFNLnN1bTwtc3VtbWFyeVNFKFRoZXJtX1RQNCwgbWVhc3VyZXZhcj0iUEFNLnByb3AiLCBncm91cHZhcnM9YygiU2l0ZSIsICJPcmlnaW4iLCAiU2l0ZS5PcmlnIiksIG5hLnJtPVRSVUUpDQoNCiMjUGxvdCBBdmVyYWdlIFJldGVudGlvbiBhY3Jvc3MgVHJlYXRtZW50cw0KVFA0X1RvbFBBTS5wbG90PC1nZ3Bsb3QoVFA0X1RvbFBBTS5zdW0sIGFlcyh4PVNpdGUsIHk9UEFNLnByb3AsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1QQU0ucHJvcC1zZSwgeW1heD1QQU0ucHJvcCtzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnR4dC5zeiksIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1sZWcudGl0bGUuc3opLCANCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIikpKw0KICBsYWJzKHg9IlNpdGUgYW5kIE9yaWdpbiIsIHk9IlBob3RvY2hlbWljYWwgRWZmaWNpZW5jeSBSZXRlbnRpb24iLCBjb2xvdXI9Ik9yaWdpbiIpKw0KICB5bGltKDAuNiwgMSk7IFRQNF9Ub2xQQU0ucGxvdA0KYGBgDQoNCg0KIyMjIEVmZmVjdCBTaXplIG92ZXIgVGltZQ0KDQpgYGB7cn0NCiMjRGF0YWZyYW1lIG9mIGVmZmVjdCBzaXplIHJlc3VsdHMNClRvbC5FUzwtZGF0YS5mcmFtZShUaW1lUD1jKHJlcCgiVFAxIiw2KSwgcmVwKCJUUDIiLDYpLCByZXAoIlRQMyIsNiksIHJlcCgiVFA0Iiw2KSksIA0KICAgICAgICAgICAgICAgICAgICBTaXRlPWMocmVwKGMoIktMIiwgIlNTIiksMTIpKSwNCiAgICAgICAgICAgICAgICAgICAgTWV0cmljPWMocmVwKGMoIlN5bS5wcm9wIiwgIlN5bS5wcm9wIiwgIkNobC5wcm9wIiwgIkNobC5wcm9wIiwgIlBBTS5wcm9wIiwgIlBBTS5wcm9wIiksNCkpLA0KICAgICAgICAgICAgICAgICAgICBFdGFTcT1jKGV0YV9zcXVhcmVkKFRvbF9TeW0ubG1lX1RQMV9LTCkkRXRhMl9wYXJ0aWFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChUb2xfU3ltLmxtZV9UUDFfU1MpJEV0YTJfcGFydGlhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRhX3NxdWFyZWQoVG9sX0NobC5sbWVfVFAxX0tMKSRFdGEyX3BhcnRpYWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YV9zcXVhcmVkKFRvbF9DaGwubG1lX1RQMV9TUykkRXRhMl9wYXJ0aWFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChUb2xfUEFNLmxtZV9UUDFfS0wpJEV0YTJfcGFydGlhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRhX3NxdWFyZWQoVG9sX1BBTS5sbWVfVFAxX1NTKSRFdGEyX3BhcnRpYWwsIA0KICAgICAgICAgICAgICAgICAgICAgZXRhX3NxdWFyZWQoVG9sX1N5bS5sbWVfVFAyX0tMKSRFdGEyX3BhcnRpYWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YV9zcXVhcmVkKFRvbF9TeW0ubG1lX1RQMl9TUykkRXRhMl9wYXJ0aWFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChUb2xfQ2hsLmxtZV9UUDJfS0wpJEV0YTJfcGFydGlhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRhX3NxdWFyZWQoVG9sX0NobC5sbWVfVFAyX1NTKSRFdGEyX3BhcnRpYWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YV9zcXVhcmVkKFRvbF9QQU0ubG1lX1RQMl9LTCkkRXRhMl9wYXJ0aWFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChUb2xfUEFNLmxtZV9UUDJfU1MpJEV0YTJfcGFydGlhbCwNCiAgICAgICAgICAgICAgICAgICAgIGV0YV9zcXVhcmVkKFRvbF9TeW0ubG1lX1RQM19LTCkkRXRhMl9wYXJ0aWFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChUb2xfU3ltLmxtZV9UUDNfU1MpJEV0YTJfcGFydGlhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRhX3NxdWFyZWQoVG9sX0NobC5sbWVfVFAzX0tMKSRFdGEyX3BhcnRpYWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YV9zcXVhcmVkKFRvbF9DaGwubG1lX1RQM19TUykkRXRhMl9wYXJ0aWFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChUb2xfUEFNLmxtZV9UUDNfS0wpJEV0YTJfcGFydGlhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRhX3NxdWFyZWQoVG9sX1BBTS5sbWVfVFAzX1NTKSRFdGEyX3BhcnRpYWwsDQogICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChUb2xfU3ltLmxtZV9UUDRfS0wpJEV0YTJfcGFydGlhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRhX3NxdWFyZWQoVG9sX1N5bS5sbWVfVFA0X1NTKSRFdGEyX3BhcnRpYWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YV9zcXVhcmVkKFRvbF9DaGwubG1lX1RQNF9LTCkkRXRhMl9wYXJ0aWFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChUb2xfQ2hsLmxtZV9UUDRfU1MpJEV0YTJfcGFydGlhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRhX3NxdWFyZWQoVG9sX1BBTS5sbWVfVFA0X0tMKSRFdGEyX3BhcnRpYWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YV9zcXVhcmVkKFRvbF9QQU0ubG1lX1RQNF9TUykkRXRhMl9wYXJ0aWFsKSwNCiAgICAgICAgICAgICAgICAgICAgUHZhbHVlPWMoc3VtbWFyeShUb2xfU3ltLmxtZV9UUDFfS0wpJGNvZWZmaWNpZW50c1sxMF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkoVG9sX1N5bS5sbWVfVFAxX1NTKSRjb2VmZmljaWVudHNbMTBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KFRvbF9DaGwubG1lX1RQMV9LTCkkY29lZmZpY2llbnRzWzEwXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeShUb2xfQ2hsLmxtZV9UUDFfU1MpJGNvZWZmaWNpZW50c1sxMF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkoVG9sX1BBTS5sbWVfVFAxX0tMKSRjb2VmZmljaWVudHNbMTBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KFRvbF9QQU0ubG1lX1RQMV9TUykkY29lZmZpY2llbnRzWzEwXSwgDQogICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KFRvbF9TeW0ubG1lX1RQMl9LTCkkY29lZmZpY2llbnRzWzEwXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeShUb2xfU3ltLmxtZV9UUDJfU1MpJGNvZWZmaWNpZW50c1sxMF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkoVG9sX0NobC5sbWVfVFAyX0tMKSRjb2VmZmljaWVudHNbMTBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KFRvbF9DaGwubG1lX1RQMl9TUykkY29lZmZpY2llbnRzWzEwXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeShUb2xfUEFNLmxtZV9UUDJfS0wpJGNvZWZmaWNpZW50c1sxMF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkoVG9sX1BBTS5sbWVfVFAyX1NTKSRjb2VmZmljaWVudHNbMTBdLA0KICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeShUb2xfU3ltLmxtZV9UUDNfS0wpJGNvZWZmaWNpZW50c1sxMF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkoVG9sX1N5bS5sbWVfVFAzX1NTKSRjb2VmZmljaWVudHNbMTBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KFRvbF9DaGwubG1lX1RQM19LTCkkY29lZmZpY2llbnRzWzEwXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeShUb2xfQ2hsLmxtZV9UUDNfU1MpJGNvZWZmaWNpZW50c1sxMF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkoVG9sX1BBTS5sbWVfVFAzX0tMKSRjb2VmZmljaWVudHNbMTBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KFRvbF9QQU0ubG1lX1RQM19TUykkY29lZmZpY2llbnRzWzEwXSwNCiAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkoVG9sX1N5bS5sbWVfVFA0X0tMKSRjb2VmZmljaWVudHNbMTBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KFRvbF9TeW0ubG1lX1RQNF9TUykkY29lZmZpY2llbnRzWzEwXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeShUb2xfQ2hsLmxtZV9UUDRfS0wpJGNvZWZmaWNpZW50c1sxMF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkoVG9sX0NobC5sbWVfVFA0X1NTKSRjb2VmZmljaWVudHNbMTBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KFRvbF9QQU0ubG1lX1RQNF9LTCkkY29lZmZpY2llbnRzWzEwXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeShUb2xfUEFNLmxtZV9UUDRfU1MpJGNvZWZmaWNpZW50c1sxMF0pKQ0KDQoNClRvbC5FUyRTaWc8LWlmZWxzZShUb2wuRVMkUHZhbHVlPDAuMDAxLCAiKioqIiwgaWZlbHNlKFRvbC5FUyRQdmFsdWU8MC4wMSwgIioqIiwgaWZlbHNlKFRvbC5FUyRQdmFsdWU8MC4wNSwgIioiLCBpZmVsc2UoVG9sLkVTJFB2YWx1ZTwwLjEsICItIiwgTkEpKSkpDQpgYGANCg0KDQojIyMjIFN5bWJpb250cw0KYGBge3IgUGxvdCBFZmZlY3QgU2l6ZSBTeW1iaW9udCBSZXRlbnRpb259DQpUb2xfU3ltLkVTLnBsb3Q8LWdncGxvdChUb2wuRVNbd2hpY2goVG9sLkVTJE1ldHJpYz09IlN5bS5wcm9wIiksXSwgYWVzKHg9VGltZVAsIHk9RXRhU3EsIGZpbGw9U2l0ZSkpKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1TaXRlLmNvbG9ycy5vKSsNCnRoZW1lX2NsYXNzaWMoKSsNCiAgZ2d0aXRsZSgiU3ltYmlvbnQgUmV0ZW50aW9uIikrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3VyPSJibGFjayIsIHNpemU9cGFuZWwubGFiLnN6LCBoanVzdD0wLjUpLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnR4dC5zeiksIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1sZWcudGl0bGUuc3opLCANCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIikpKw0KICAgbGFicyh4PSJUaW1lIFBvaW50IiwgeT1leHByZXNzaW9uKHBhc3RlKCJFZmZlY3QgU2l6ZSAocCIsIGV0YV4yLCAiKSIpKSwgY29sb3VyPSJTaXRlIikrDQogIHlsaW0oMCwgMC40KSsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1TaWcpLCB2anVzdD0tMC4wMiwgY29sb3I9ImJsYWNrIiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC45KSwgc2l6ZT1sZXZlbHMuc3osIGZvbnRmYWNlPSJib2xkIik7IFRvbF9TeW0uRVMucGxvdA0KDQpgYGANCg0KDQojIyMjIENobG9yb3BoeWxsDQpgYGB7ciBQbG90IEVmZmVjdCBTaXplIENobG9yb3BoeWxsIFJldGVudGlvbn0NClRvbF9DaGwuRVMucGxvdDwtZ2dwbG90KFRvbC5FU1t3aGljaChUb2wuRVMkTWV0cmljPT0iQ2hsLnByb3AiKSxdLCBhZXMoeD1UaW1lUCwgeT1FdGFTcSwgZmlsbD1TaXRlKSkrDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkrDQogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPVNpdGUuY29sb3JzLm8pKw0KdGhlbWVfY2xhc3NpYygpKw0KICBnZ3RpdGxlKCJDaGxvcm9waHlsbCBSZXRlbnRpb24iKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT1wYW5lbC5sYWIuc3osIGhqdXN0PTAuNSksIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT1sZWcudHh0LnN6KSwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPWxlZy50aXRsZS5zeiksIA0KICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiYmxhY2siKSkrDQogICBsYWJzKHg9IlRpbWUgUG9pbnQiLCB5PWV4cHJlc3Npb24ocGFzdGUoIkVmZmVjdCBTaXplIChwIiwgZXRhXjIsICIpIikpLCBjb2xvdXI9IlNpdGUiKSsNCiAgeWxpbSgwLCAwLjQpKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsPVNpZyksIHZqdXN0PS0wLjAyLCBjb2xvcj0iYmxhY2siLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjkpLCBzaXplPWxldmVscy5zeiwgZm9udGZhY2U9ImJvbGQiKTsgVG9sX0NobC5FUy5wbG90DQoNCmBgYA0KDQoNCiMjIyMgRnZGbQ0KYGBge3IgUGxvdCBFZmZlY3QgU2l6ZSBGdkZtIFJldGVudGlvbn0NClRvbF9QQU0uRVMucGxvdDwtZ2dwbG90KFRvbC5FU1t3aGljaChUb2wuRVMkTWV0cmljPT0iUEFNLnByb3AiKSxdLCBhZXMoeD1UaW1lUCwgeT1FdGFTcSwgZmlsbD1TaXRlKSkrDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkrDQogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPVNpdGUuY29sb3JzLm8pKw0KdGhlbWVfY2xhc3NpYygpKw0KICBnZ3RpdGxlKCJQaG90b2NoZW1pY2FsIEVmZmljaWVuY3kgUmV0ZW50aW9uIikrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3VyPSJibGFjayIsIHNpemU9cGFuZWwubGFiLnN6LCBoanVzdD0wLjUpLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnR4dC5zeiksIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1sZWcudGl0bGUuc3opLCANCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIikpKw0KICAgbGFicyh4PSJUaW1lIFBvaW50IiwgeT1leHByZXNzaW9uKHBhc3RlKCJFZmZlY3QgU2l6ZSAocCIsIGV0YV4yLCAiKSIpKSwgY29sb3VyPSJTaXRlIikrDQogIHlsaW0oMCwgMC40KSsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1TaWcpLCB2anVzdD0tMC4wMiwgY29sb3I9ImJsYWNrIiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC45KSwgc2l6ZT1sZXZlbHMuc3osIGZvbnRmYWNlPSJib2xkIik7IFRvbF9QQU0uRVMucGxvdA0KDQpgYGANCg0KDQojIFRyYWRlIE9mZnMNCg0KIyMjIEF2ZXJhZ2UgUGVyZm9ybWFuY2UNCkNhbGN1bGF0aW5nIHRoZSBhdmVyYWdlIG9mIEdyb3d0aCAoVFAxIHRvIFRQMikgYW5kIFRoZXJtYWwgVG9sZXJhbmNlIChSZXRlbnRpb24gb2YgU3ltYmlvbnRzLCBDaGxvcm9waHlsbCwgYW5kIFBob3RvY2hlbWljYWwgRWZmaWNpZW5jeSBhdCBUUDEpIGZvciBlYWNoIFNldCAoU2l0ZSwgR2Vub3R5cGUsIE9yaWdpbikNCg0KIyMjIyBHcm93dGgNCmBgYHtyfQ0KIyNBdmVyYWdlDQpuYW1lcyhHcm93dGgpDQpHcm93dGhfU2V0PC1hZ2dyZWdhdGUoR3Jvd3RoJFRMRV9jbS5kYXksIGxpc3QoR3Jvd3RoJFNpdGUsIEdyb3d0aCRHZW5vdHlwZSwgR3Jvd3RoJE9yaWcpLCBtZWFuKQ0KbmFtZXMoR3Jvd3RoX1NldCk8LWMoIlNpdGUiLCAiR2Vub3R5cGUiLCAiT3JpZyIsICJUTEVfY20uZGF5IikNCg0KIyNBZGQgU3RhbmRhcmQgRXJyb3INCkdyb3d0aF9TZXQkVExFX3NlPC1hZ2dyZWdhdGUoR3Jvd3RoJFRMRV9jbS5kYXksIGxpc3QoR3Jvd3RoJFNpdGUsIEdyb3d0aCRHZW5vdHlwZSwgR3Jvd3RoJE9yaWcpLCBzdGQuZXJyb3IpWyw0XQ0KYGBgDQoNCg0KIyMjIyBUb2xlcmFuY2UNCmBgYHtyfQ0KIyNBdmVyYWdlDQpuYW1lcyhUaGVybV9UUDEpDQpUaGVybV9TZXQ8LWFnZ3JlZ2F0ZShUaGVybV9UUDFbLGMoMTk6MjEpXSwgbGlzdChUaGVybV9UUDEkU2l0ZSwgVGhlcm1fVFAxJEdlbm90eXBlLCBUaGVybV9UUDEkT3JpZyksIG1lYW4pDQpuYW1lcyhUaGVybV9TZXQpPC1jKCJTaXRlIiwgIkdlbm90eXBlIiwgIk9yaWciLCAiQ2hsLnByb3AiLCAiU3ltLnByb3AiLCAiUEFNLnByb3AiKQ0KDQojI0FkZCBTdGFuZGFyZCBFcnJvcg0KVGhlcm1fU2V0JENobF9zZTwtYWdncmVnYXRlKFRoZXJtX1RQMSRDaGwucHJvcCwgbGlzdChUaGVybV9UUDEkU2l0ZSwgVGhlcm1fVFAxJEdlbm90eXBlLCBUaGVybV9UUDEkT3JpZyksIHN0ZC5lcnJvcilbLDRdDQoNClRoZXJtX1NldCRTeW1fc2U8LWFnZ3JlZ2F0ZShUaGVybV9UUDEkU3ltLnByb3AsIGxpc3QoVGhlcm1fVFAxJFNpdGUsIFRoZXJtX1RQMSRHZW5vdHlwZSwgVGhlcm1fVFAxJE9yaWcpLCBzdGQuZXJyb3IpWyw0XQ0KDQpUaGVybV9TZXQkUEFNX3NlPC1hZ2dyZWdhdGUoVGhlcm1fVFAxJFBBTS5wcm9wLCBsaXN0KFRoZXJtX1RQMSRTaXRlLCBUaGVybV9UUDEkR2Vub3R5cGUsIFRoZXJtX1RQMSRPcmlnKSwgc3RkLmVycm9yKVssNF0NCmBgYA0KDQoNCiMjIyMgTWVyZ2UgR3Jvd3RoIGFuZCBUb2xlcmFuY2UgDQpgYGB7cn0NClBlcmZfU2V0PC1tZXJnZShHcm93dGhfU2V0LCBUaGVybV9TZXQsIGFsbD1UUlVFKQ0KUGVyZl9TZXQkU2V0PC1wYXN0ZShQZXJmX1NldCRTaXRlLCBQZXJmX1NldCRHZW5vdHlwZSwgUGVyZl9TZXQkT3JpZywgc2VwPSIuIikNCg0KIyNTZXQgZmFjdG9yIHZhcmlhYmxlcw0KUGVyZl9TZXQkU2l0ZTwtZmFjdG9yKFBlcmZfU2V0JFNpdGUsIGxldmVscz1jKCJLTCIsICJTUyIpKQ0KUGVyZl9TZXQkR2Vub3R5cGU8LWZhY3RvcihQZXJmX1NldCRHZW5vdHlwZSwgbGV2ZWxzPWMoIkFDOCIsICJBQzEwIiwgIkFDMTIiKSkNClBlcmZfU2V0JE9yaWc8LWZhY3RvcihQZXJmX1NldCRPcmlnLCBsZXZlbHM9YygiTiIsICJUIikpDQoNCiMjQWRkIGEgU2FtcGxlIFNldCBWYXJpYWJsZQ0KUGVyZl9TZXQkU2V0PC1wYXN0ZShQZXJmX1NldCRTaXRlLCBQZXJmX1NldCRHZW5vdHlwZSwgUGVyZl9TZXQkT3JpZywgc2VwPSIuIikNClBlcmZfU2V0JFNldDwtZmFjdG9yKFBlcmZfU2V0JFNldCkNCg0KIyNBZGQgU2l0ZS5PcmlnIHZhcmlhYmxlDQpQZXJmX1NldCRTaXRlLk9yaWc8LXBhc3RlKFBlcmZfU2V0JFNpdGUsIFBlcmZfU2V0JE9yaWcsIHNlcD0iLiIpDQpQZXJmX1NldCRTaXRlLk9yaWc8LWZhY3RvcihQZXJmX1NldCRTaXRlLk9yaWcsIGxldmVscz1jKCJLTC5OIiwgIktMLlQiLCAiU1MuTiIsICJTUy5UIikpDQoNCmBgYA0KDQoNCiMjIyBDb3JyZWxhdGlvbiBiZXR3ZWVuIEdyb3d0aCBhbmQgVG9sZXJhbmNlDQoNCiMjIyMgU3ltYmlvbnQgUmV0ZW50aW9uDQoNCmBgYHtyfQ0KY29yLnRlc3QoUGVyZl9TZXQkVExFX2NtLmRheSwgUGVyZl9TZXQkU3ltLnByb3AsIG1ldGhvZD0ic3BlYXJtYW4iKQ0KYGBgDQoNCg0KYGBge3IgUGxvdCBHcm93dGggdnMgU3ltYmlvbnQgUmV0ZW50aW9ufQ0KVExFX1N5bS5wbG90PC1nZ3Bsb3QoUGVyZl9TZXQsIGFlcyh4PVRMRV9jbS5kYXksIHk9U3ltLnByb3ApKSArIA0KICAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIGNvbG9yPSIjQUExODVBRkYiLCBmaWxsPSIjRjhEN0JGRkYiLCBzZT1UUlVFKSsNCiAgIGdlb21fcG9pbnQoYWVzKGNvbG91cj1TaXRlLk9yaWcpLHNpemU9cG9pbnQuc3opKw0KICAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpKSsNCiAgbGFicyh4PWV4cHJlc3Npb24ocGFzdGUoJ0dyb3d0aCBSYXRlIChjbSBkYXknXi0xKiIpIikpLCANCiAgICAgICB5PSJTeW1iaW9udCBSZXRlbnRpb24iLCANCiAgICAgICBjb2xvdXI9IlNpdGUgT3JpZ2luIikrDQogICBhbm5vdGF0ZSgidGV4dCIsIHggPSAwLjA3LCB5ID0gMCwgbGFiZWw9ZXhwcmVzc2lvbihib2xkaXRhbGljKHBhc3RlKHJbU10sICIgPSAtMC42MTUsIHAgPSAwLjAzNyIpKSksIHNpemU9c2lnLnN6LCBoanVzdCA9IDApOyBUTEVfU3ltLnBsb3QNCmBgYA0KDQoNCiMjIyMgQ2hsb3JvcGh5bGwgUmV0ZW50aW9uDQoNCmBgYHtyfQ0KY29yLnRlc3QoUGVyZl9TZXQkVExFX2NtLmRheSwgUGVyZl9TZXQkQ2hsLnByb3AsIG1ldGhvZD0ic3BlYXJtYW4iKQ0KYGBgDQoNCg0KYGBge3IgUGxvdCBHcm93dGggdnMgQ2hsb3JvcGh5bGwgUmV0ZW50aW9ufQ0KVExFX0NobC5wbG90PC1nZ3Bsb3QoUGVyZl9TZXQsIGFlcyh4PVRMRV9jbS5kYXksIHk9Q2hsLnByb3ApKSArIA0KICAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIGNvbG9yPSIjQUExODVBRkYiLCBmaWxsPSIjRjhEN0JGRkYiLCBzZT1UUlVFKSsNCiAgIGdlb21fcG9pbnQoYWVzKGNvbG91cj1TaXRlLk9yaWcpLHNpemU9cG9pbnQuc3opKw0KICAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpKSsNCiAgbGFicyh4PWV4cHJlc3Npb24ocGFzdGUoJ0dyb3d0aCBSYXRlIChjbSBkYXknXi0xKiIpIikpLCANCiAgICAgICB5PSJDaGxvcm9waHlsbCBSZXRlbnRpb24iLCANCiAgICAgICBjb2xvdXI9IlNpdGUgT3JpZ2luIikrDQogICBhbm5vdGF0ZSgidGV4dCIsIHggPSAwLjA3LCB5ID0gMCwgbGFiZWw9ZXhwcmVzc2lvbihib2xkaXRhbGljKHBhc3RlKHJbU10sICIgPSAtMC41ODcsIHAgPSAwLjA0OSIpKSksIHNpemU9c2lnLnN6LCBoanVzdCA9IDApOyBUTEVfQ2hsLnBsb3QNCmBgYA0KDQoNCiMjIyMgRnZGbSBSZXRlbnRpb24NCg0KYGBge3J9DQpjb3IudGVzdChQZXJmX1NldCRUTEVfY20uZGF5LCBQZXJmX1NldCRQQU0ucHJvcCwgbWV0aG9kPSJzcGVhcm1hbiIpDQpgYGANCg0KDQpgYGB7ciBQbG90IEdyb3d0aCB2cyBGdkZtIFJldGVudGlvbn0NClRMRV9QQU0ucGxvdDwtZ2dwbG90KFBlcmZfU2V0LCBhZXMoeD1UTEVfY20uZGF5LCB5PVBBTS5wcm9wKSkgKyANCiAgIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBjb2xvcj0iI0FBMTg1QUZGIiwgZmlsbD0iI0Y4RDdCRkZGIiwgc2U9VFJVRSkrDQogICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9U2l0ZS5PcmlnKSxzaXplPXBvaW50LnN6KSsNCiAgICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIA0KICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT1sZWcudHh0LnN6KSwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPWxlZy50aXRsZS5zeiksIA0KICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiYmxhY2siKSkrDQogIGxhYnMoeD1leHByZXNzaW9uKHBhc3RlKCdHcm93dGggUmF0ZSAoY20gZGF5J14tMSoiKSIpKSwgDQogICAgICAgeT0iUGhvdG8uIEVmZmljLiBSZXRlbnRpb24iLCANCiAgICAgICBjb2xvdXI9IlNpdGUgT3JpZ2luIikrDQogICBhbm5vdGF0ZSgidGV4dCIsIHggPSAwLjA3LCB5ID0gMC43NCwgbGFiZWw9ZXhwcmVzc2lvbihib2xkaXRhbGljKHBhc3RlKHJbU10sICIgPSAtMC42NzgsIHAgPSAwLjAxOSIpKSksIHNpemU9c2lnLnN6LCBoanVzdCA9IDApOyBUTEVfUEFNLnBsb3QNCmBgYA0KDQoNCiMgRmlndXJlcw0KDQojIyMgRmlndXJlIDMgR3Jvd3RoIGFuZCBUb2xlcmFuY2UgRVMNCg0KIyMjIyBBZGp1c3QgRmlndXJlcyBmb3IgUGFuZWwNCmBgYHtyfQ0KIyNHcm93dGgNClRQMS4yX0dyb3d0aC5wbG90LmN1dDwtZ2dwbG90KFRQMS4yX0dyb3d0aC5zdW0sIGFlcyh4PVNpdGUsIHk9VExFX2NtLmRheSwgY29sb3VyPVNpdGUuT3JpZykpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPVRMRV9jbS5kYXktc2UsIHltYXg9VExFX2NtLmRheStzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnR4dC5zeiksIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1sZWcudGl0bGUuc3opLCANCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIiksIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMiwgMC44KSkrDQogIGxhYnMoeD0iU2l0ZSBhbmQgT3JpZ2luIiwgeT1leHByZXNzaW9uKHBhc3RlKCdHcm93dGggUmF0ZSAoY20gZGF5J14tMSoiKSIpKSwgY29sb3VyPSJPcmlnaW4iKSsNCiAgeWxpbSgwLCAwLjMpKw0KICAgIGFubm90YXRlKCJ0ZXh0IiwgeD0yLCB5PTAuMjQsIGxhYmVsPSIqIiwgc2l6ZT1zaWcuc3osIGZvbnRmYWNlPSJib2xkIikrDQogIGdlb21fYnJhY2tldCh4bWluPTEsIHhtYXg9MiwgeS5wb3NpdGlvbj0wLjAxLCBsYWJlbC5zaXplPWxldmVscy5zeiwgbGFiZWw9IioqIiwgaW5oZXJpdC5hZXMgPSBGQUxTRSkNCg0KIyNGdkZtIFJldGVudGlvbg0KVG9sX1BBTS5FUy5wbG90LmN1dDwtZ2dwbG90KFRvbC5FU1t3aGljaChUb2wuRVMkTWV0cmljPT0iUEFNLnByb3AiKSxdLCBhZXMoeD1UaW1lUCwgeT1FdGFTcSwgZmlsbD1TaXRlKSkrDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1TaXRlLmNvbG9ycy5vKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICBnZ3RpdGxlKCJQaG90b2NoZW1pY2FsIEVmZmljaWVuY3kiKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT1wYW5lbC5sYWIuc3osIGhqdXN0PTAuNSksIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT1sZWcudHh0LnN6KSwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPWxlZy50aXRsZS5zeiksIA0KICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiYmxhY2siKSwgbGVnZW5kLnBvc2l0aW9uPWMoMC44LCAwLjgpKSsNCiAgbGFicyh4PSJUaW1lIFBvaW50IiwgeT1leHByZXNzaW9uKHBhc3RlKCJFZmZlY3QgU2l6ZSAocCIsIGV0YV4yLCAiKSIpKSwgY29sb3VyPSJTaXRlIikrDQogIHlsaW0oMCwgMC4zNSkrDQogIGdlb21fdGV4dChhZXMobGFiZWw9U2lnKSwgdmp1c3Q9LTAuMDIsIGNvbG9yPSJibGFjayIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOSksIHNpemU9bGV2ZWxzLnN6LCBmb250ZmFjZT0iYm9sZCIpDQoNCiMjU3ltYmlvbnQgUmV0ZW50aW9uDQpUb2xfU3ltLkVTLnBsb3QuY3V0PC1nZ3Bsb3QoVG9sLkVTW3doaWNoKFRvbC5FUyRNZXRyaWM9PSJTeW0ucHJvcCIpLF0sIGFlcyh4PVRpbWVQLCB5PUV0YVNxLCBmaWxsPVNpdGUpKSsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPVNpdGUuY29sb3JzLm8pKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIGdndGl0bGUoIlN5bWJpb250cyIpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplPXBhbmVsLmxhYi5zeiwgaGp1c3Q9MC41KSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KICBsYWJzKHg9IlRpbWUgUG9pbnQiLCB5PWV4cHJlc3Npb24ocGFzdGUoIkVmZmVjdCBTaXplIChwIiwgZXRhXjIsICIpIikpLCBjb2xvdXI9IlNpdGUiKSsNCiAgeWxpbSgwLCAwLjM1KSsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1TaWcpLCB2anVzdD0tMC4wMiwgY29sb3I9ImJsYWNrIiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC45KSwgc2l6ZT1sZXZlbHMuc3osIGZvbnRmYWNlPSJib2xkIikNCg0KDQojI0NobG9yb3BoeWxsIFJldGVudGlvbg0KVG9sX0NobC5FUy5wbG90LmN1dDwtZ2dwbG90KFRvbC5FU1t3aGljaChUb2wuRVMkTWV0cmljPT0iQ2hsLnByb3AiKSxdLCBhZXMoeD1UaW1lUCwgeT1FdGFTcSwgZmlsbD1TaXRlKSkrDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1TaXRlLmNvbG9ycy5vKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICBnZ3RpdGxlKCJDaGxvcm9waHlsbCIpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplPXBhbmVsLmxhYi5zeiwgaGp1c3Q9MC41KSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KICBsYWJzKHg9IlRpbWUgUG9pbnQiLCB5PWV4cHJlc3Npb24ocGFzdGUoIkVmZmVjdCBTaXplIChwIiwgZXRhXjIsICIpIikpLCBjb2xvdXI9IlNpdGUiKSsNCiAgeWxpbSgwLCAwLjM1KSsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1TaWcpLCB2anVzdD0tMC4wMiwgY29sb3I9ImJsYWNrIiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC45KSwgc2l6ZT1sZXZlbHMuc3osIGZvbnRmYWNlPSJib2xkIikNCg0KYGBgDQoNCg0KIyMjIyBGaWd1cmUgMw0KYGBge3J9DQojI0NyZWF0ZSBQYW5lbA0KUGVyZm9ybWFuY2VfZmlnPC1wbG90X2dyaWQoVFAxLjJfR3Jvd3RoLnBsb3QuY3V0LCBUb2xfUEFNLkVTLnBsb3QuY3V0LCANCiAgICAgICAgICAgICAgICAgICAgICBUb2xfU3ltLkVTLnBsb3QuY3V0LCBUb2xfQ2hsLkVTLnBsb3QuY3V0LA0KICAgICAgICAgICAgICAgICAgICByZWxfd2lkdGhzPWMoMSwgMSwgMSwgMSksIA0KICAgICAgICAgICAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMSwgMSwgMSwgMSksDQogICAgICAgICAgICAgICAgICAgIG5yb3c9MiwgbmNvbD0yLCBieXJvdz1ULCBsYWJlbHMgPSBjKCJBIiwgIkIiLCAiQyIsICJEIikpDQoNCiMjU2F2ZSBGaWd1cmUNCmdnc2F2ZShmaWxlbmFtZT0iRmlndXJlcy8wM19QZXJmb3JtYW5jZS9GaWczX1BlcmZvcm1hbmNlLnBuZyIsIHBsb3Q9UGVyZm9ybWFuY2VfZmlnLCBkcGk9MzAwLCB3aWR0aD0xMCwgaGVpZ2h0PTgsIHVuaXRzPSJpbiIpDQoNCmBgYA0KDQoNCg0KIyMjIEZpZ3VyZSA0IEdyb3d0aCB2cyBUb2xlcmFuY2UNCg0KIyMjIyBBZGp1c3QgRmlndXJlcyBmb3IgUGFuZWwNCmBgYHtyfQ0KIyNHcm93dGggdnMgRnZGbSBSZXRlbnRpb24NClRMRV9QQU0ucGxvdC5jdXQ8LWdncGxvdChQZXJmX1NldCwgYWVzKHg9VExFX2NtLmRheSwgeT1QQU0ucHJvcCkpICsgDQogICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgY29sb3I9IiNBQTE4NUFGRiIsIGZpbGw9IiNGOEQ3QkZGRiIsIHNlPVRSVUUpKw0KICAgZ2VvbV9wb2ludChhZXMoY29sb3VyPVNpdGUuT3JpZyksc2l6ZT1wb2ludC5zeikrDQogICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9T3JpZy5jb2xvcnMubykrDQogICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBsZWdlbmQucG9zaXRpb249Im5vbmUiKSsNCiAgbGFicyh4PWV4cHJlc3Npb24ocGFzdGUoJ0dyb3d0aCBSYXRlIChjbSBkYXknXi0xKiIpIikpLCANCiAgICAgICB5PSJQaG90by4gRWZmaWMuIFJldGVudGlvbiIsIA0KICAgICAgIGNvbG91cj0iU2l0ZSBPcmlnaW4iKSsNCiAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDAuMDcsIHkgPSAwLjc1LCBsYWJlbD1leHByZXNzaW9uKGJvbGRpdGFsaWMocGFzdGUocltTXSwgIiA9IC0wLjY3OCwgcCA9IDAuMDE5IikpKSwgc2l6ZT1zaWcuc3osIGhqdXN0ID0gMCkNCg0KIyNHcm93dGggdnMgU3ltYmlvbnQgUmV0ZW50aW9uDQpUTEVfU3ltLnBsb3QuY3V0PC1nZ3Bsb3QoUGVyZl9TZXQsIGFlcyh4PVRMRV9jbS5kYXksIHk9U3ltLnByb3ApKSArIA0KICAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIGNvbG9yPSIjQUExODVBRkYiLCBmaWxsPSIjRjhEN0JGRkYiLCBzZT1UUlVFKSsNCiAgIGdlb21fcG9pbnQoYWVzKGNvbG91cj1TaXRlLk9yaWcpLHNpemU9cG9pbnQuc3opKw0KICAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrDQogIGxhYnMoeD1leHByZXNzaW9uKHBhc3RlKCdHcm93dGggUmF0ZSAoY20gZGF5J14tMSoiKSIpKSwgDQogICAgICAgeT0iU3ltYmlvbnQgUmV0ZW50aW9uIiwgDQogICAgICAgY29sb3VyPSJTaXRlIE9yaWdpbiIpKw0KICAgYW5ub3RhdGUoInRleHQiLCB4ID0gMC4wNywgeSA9IDAsIGxhYmVsPWV4cHJlc3Npb24oYm9sZGl0YWxpYyhwYXN0ZShyW1NdLCAiID0gLTAuNjE1LCBwID0gMC4wMzciKSkpLCBzaXplPXNpZy5zeiwgaGp1c3QgPSAwKQ0KYGBgDQoNCg0KDQojIyMjIEZpZ3VyZSA0DQpgYGB7cn0NCiMjQ3JlYXRlIFBhbmVsDQpUcmFkZU9mZl9maWc8LXBsb3RfZ3JpZChUTEVfUEFNLnBsb3QuY3V0LCBUTEVfU3ltLnBsb3QuY3V0LCBUTEVfQ2hsLnBsb3QsDQogICAgICAgICAgICAgICAgICAgIHJlbF93aWR0aHM9YyguNzUsIC43NSwgMSksIA0KICAgICAgICAgICAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMSwgMSwgMSksDQogICAgICAgICAgICAgICAgICAgIG5yb3c9MSwgbmNvbD0zLCBieXJvdz1ULCBsYWJlbHMgPSBjKCJBIiwgIkIiLCAiQyIpKQ0KDQojI1NhdmUgRmlndXJlDQpnZ3NhdmUoZmlsZW5hbWU9IkZpZ3VyZXMvMDNfUGVyZm9ybWFuY2UvRmlnNF9UcmFkZU9mZi5wbmciLCBwbG90PVRyYWRlT2ZmX2ZpZywgZHBpPTMwMCwgd2lkdGg9MTIsIGhlaWdodD00LCB1bml0cz0iaW4iKQ0KDQpgYGANCg0KDQojIyMgRmlndXJlIFM0IEluaXRpYWwgSGVhdCBBc3NheQ0KDQojIyMjIEFkanVzdCBGaWd1cmVzIGZvciBQYW5lbA0KYGBge3J9DQojI0Z2Rm0NCklOX1BBTS5wbG90LmN1dDwtZ2dwbG90KElOX1BBTS5zdW0sIGFlcyh4PVNpdGUuVHJlYXQsIHk9RnZfRm0sIGNvbG91cj1TaXRlKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9U2l0ZS5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49RnZfRm0tc2UsIHltYXg9RnZfRm0rc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChhZXMoc2hhcGU9VHJlYXRtZW50KSwgc2l6ZT1wb2ludC5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkrDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXM9YygxLDE2KSkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIA0KICAgICAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiKSsNCiAgbGFicyh4PSIiLCB5PSJGdi9GbSIsIGNvbG91cj0iU2l0ZSIpKw0KICB5bGltKDAuNSwgMC42NTUpDQoNCklOX1RvbFBBTS5wbG90LmN1dDwtZ2dwbG90KElOX1RvbFBBTS5zdW0sIGFlcyh4PVNpdGUsIHk9UEFNLnByb3AsIGNvbG91cj1TaXRlKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9U2l0ZS5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49UEFNLnByb3Atc2UsIHltYXg9UEFNLnByb3Arc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KICBsYWJzKHg9IiIsIHk9IlJldGVudGlvbiIsIGNvbG91cj0iU2l0ZSIpKw0KICB5bGltKDAuNzUsIDEpKw0KICBhbm5vdGF0ZSgidGV4dCIsIHg9MS41LCB5PTAuOTUsIGxhYmVsPSIqIiwgc2l6ZT1zaWcuc3osIGZvbnRmYWNlPSJib2xkIikNCg0KIyNTeW1iaW9udHMNCklOX1N5bS5wbG90LmN1dDwtZ2dwbG90KElOX1N5bS5zdW0sIGFlcyh4PVNpdGUuVHJlYXQsIHk9U3ltMTAuNl9jbTIsIGNvbG91cj1TaXRlKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9U2l0ZS5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49U3ltMTAuNl9jbTItc2UsIHltYXg9U3ltMTAuNl9jbTIrc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChhZXMoc2hhcGU9VHJlYXRtZW50KSwgc2l6ZT1wb2ludC5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkrDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXM9YygxLDE2KSkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIA0KICAgICAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiKSsNCiAgbGFicyh4PSIiLCB5PWV4cHJlc3Npb24ocGFzdGUoJ1N5bWJpb250cyAoJyoxMF42LCdjZWxscyBjbSdeLTIqIikiKSksIGNvbG91cj0iU2l0ZSIpKw0KICB5bGltKDAsIDEpDQoNCklOX1RvbFN5bS5wbG90LmN1dDwtZ2dwbG90KElOX1RvbFN5bS5zdW0sIGFlcyh4PVNpdGUsIHk9U3ltLnByb3AsIGNvbG91cj1TaXRlKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9U2l0ZS5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49U3ltLnByb3Atc2UsIHltYXg9U3ltLnByb3Arc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KICBsYWJzKHg9IiIsIHk9IlJldGVudGlvbiIsIGNvbG91cj0iU2l0ZSIpKw0KICB5bGltKC4yNSwgLjc1KSsNCiAgYW5ub3RhdGUoInRleHQiLCB4PTEuNSwgeT0wLjcsIGxhYmVsPSItIiwgc2l6ZT1zaWcuc3osIGZvbnRmYWNlPSJib2xkIikNCg0KIyNDaGxvcm9waHlsbA0KSU5fQ2hsLnBsb3QuY3V0PC1nZ3Bsb3QoSU5fQ2hsLnN1bSwgYWVzKHg9U2l0ZS5UcmVhdCwgeT1DaGxfdWcuY20yLCBjb2xvdXI9U2l0ZSkpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPVNpdGUuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUNobF91Zy5jbTItc2UsIHltYXg9Q2hsX3VnLmNtMitzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KGFlcyhzaGFwZT1UcmVhdG1lbnQpLCBzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDEsMTYpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KICBsYWJzKHg9IlNpdGUgYW5kIFRyZWF0bWVudCIsIHk9ZXhwcmVzc2lvbihwYXN0ZSgnQ2hsb3JvcGh5bGwgKFx1MDNCQ2cgY20nXi0yKiIpIikpLCBjb2xvdXI9IlNpdGUiKSsNCiAgeWxpbSgwLCAxLjI1KQ0KDQpJTl9Ub2xDaGwucGxvdC5jdXQ8LWdncGxvdChJTl9Ub2xDaGwuc3VtLCBhZXMoeD1TaXRlLCB5PUNobC5wcm9wLCBjb2xvdXI9U2l0ZSkpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPVNpdGUuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUNobC5wcm9wLXNlLCB5bWF4PUNobC5wcm9wK3NlKSwgd2lkdGg9Y2FwLnN6LCBsaW5ld2lkdGg9YmFyLnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSArDQogIGdlb21fcG9pbnQoc2l6ZT1wb2ludC5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIA0KICAgICAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiKSsNCiAgbGFicyh4PSJTaXRlIiwgeT0iUmV0ZW50aW9uIiwgY29sb3VyPSJTaXRlIikrDQogIHlsaW0oMCwgMC4yNSkNCmBgYA0KDQoNCiMjIyMgRmlndXJlIFM0DQpgYGB7cn0NCiMjQ3JlYXRlIFBhbmVsDQpJTl9IZWF0QXNzYXlfZmlnPC1wbG90X2dyaWQoSU5fUEFNLnBsb3QuY3V0LCBJTl9Ub2xQQU0ucGxvdC5jdXQsIA0KICAgICAgICAgICAgICAgICAgICAgIElOX1N5bS5wbG90LmN1dCwgSU5fVG9sU3ltLnBsb3QuY3V0LA0KICAgICAgICAgICAgICAgICAgICAgIElOX0NobC5wbG90LmN1dCwgSU5fVG9sQ2hsLnBsb3QuY3V0LA0KICAgICAgICAgICAgICAgICAgICByZWxfd2lkdGhzPWMoMSwgMC43NSksIA0KICAgICAgICAgICAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMSwgMSwgMSksDQogICAgICAgICAgICAgICAgICAgIG5yb3c9MywgbmNvbD0yLCBieXJvdz1ULCBsYWJlbHMgPSBjKCJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIpKQ0KDQojI1NhdmUgRmlndXJlDQpnZ3NhdmUoZmlsZW5hbWU9IkZpZ3VyZXMvMDNfUGVyZm9ybWFuY2UvRmlnUzRfSW5pdGlhbEhlYXRBc3NheS5wbmciLCBwbG90PUlOX0hlYXRBc3NheV9maWcsIGRwaT0zMDAsIHdpZHRoPTgsIGhlaWdodD0xMSwgdW5pdHM9ImluIikNCg0KYGBgDQoNCg0KIyMjIEZpZ3VyZSBTNSBVbml2YXJpYXRlIFBhbmVscw0KDQojIyMjIEFkanVzdCBGaWd1cmVzIGZvciBQYW5lbA0KYGBge3J9DQoNCiMjRnZGbQ0KVFAxX1RvbFBBTS5wbG90LmN1dDwtZ2dwbG90KFRQMV9Ub2xQQU0uc3VtLCBhZXMoeD1TaXRlLCB5PVBBTS5wcm9wLCBjb2xvdXI9U2l0ZS5PcmlnKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9T3JpZy5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49UEFNLnByb3Atc2UsIHltYXg9UEFNLnByb3Arc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICBnZ3RpdGxlKCJUUDEiKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT1wYW5lbC5sYWIuc3osIGZhY2U9ImJvbGQiLCBoanVzdD0wLjUpLGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrDQogIGxhYnMoeD0iIiwgeT0iUGhvdG8uIEVmZmljLiBSZXRlbnRpb24iLCBjb2xvdXI9Ik9yaWdpbiIpKw0KICB5bGltKDAuNywgMSkrDQogIGFubm90YXRlKCJ0ZXh0IiwgeD0xLCB5PTEsIGxhYmVsPSIqKiIsIHNpemU9c2lnLnN6LCBmb250ZmFjZT0iYm9sZCIpDQoNClRQMl9Ub2xQQU0ucGxvdC5jdXQ8LWdncGxvdChUUDJfVG9sUEFNLnN1bSwgYWVzKHg9U2l0ZSwgeT1QQU0ucHJvcCwgY29sb3VyPVNpdGUuT3JpZykpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPVBBTS5wcm9wLXNlLCB5bWF4PVBBTS5wcm9wK3NlKSwgd2lkdGg9Y2FwLnN6LCBsaW5ld2lkdGg9YmFyLnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSArDQogIGdlb21fcG9pbnQoc2l6ZT1wb2ludC5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgZ2d0aXRsZSgiVFAyIikrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3VyPSJibGFjayIsIHNpemU9cGFuZWwubGFiLnN6LCBmYWNlPSJib2xkIiwgaGp1c3Q9MC41KSxheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KICBsYWJzKHg9IiIsIHk9IiIsIGNvbG91cj0iT3JpZ2luIikrDQogIHlsaW0oMC43LCAxKSsNCiAgYW5ub3RhdGUoInRleHQiLCB4PTEsIHk9MSwgbGFiZWw9IioiLCBzaXplPXNpZy5zeiwgZm9udGZhY2U9ImJvbGQiKQ0KDQpUUDNfVG9sUEFNLnBsb3QuY3V0PC1nZ3Bsb3QoVFAzX1RvbFBBTS5zdW0sIGFlcyh4PVNpdGUsIHk9UEFNLnByb3AsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1QQU0ucHJvcC1zZSwgeW1heD1QQU0ucHJvcCtzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIGdndGl0bGUoIlRQMyIpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplPXBhbmVsLmxhYi5zeiwgZmFjZT0iYm9sZCIsIGhqdXN0PTAuNSksYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIA0KICAgICAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiKSsNCiAgbGFicyh4PSIiLCB5PSIiLCBjb2xvdXI9Ik9yaWdpbiIpKw0KICB5bGltKDAuNywgMSkNCg0KVFA0X1RvbFBBTS5wbG90LmN1dDwtZ2dwbG90KFRQNF9Ub2xQQU0uc3VtLCBhZXMoeD1TaXRlLCB5PVBBTS5wcm9wLCBjb2xvdXI9U2l0ZS5PcmlnKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9T3JpZy5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49UEFNLnByb3Atc2UsIHltYXg9UEFNLnByb3Arc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICBnZ3RpdGxlKCJUUDQiKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT1wYW5lbC5sYWIuc3osIGZhY2U9ImJvbGQiLCBoanVzdD0wLjUpLGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnR4dC5zeiksIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1sZWcudGl0bGUuc3opLCANCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIikpKw0KICBsYWJzKHg9IiIsIHk9IiIsIGNvbG91cj0iT3JpZ2luIikrDQogIHlsaW0oMC43LCAxKQ0KDQoNCiMjU3ltYmlvbnRzDQpUUDFfVG9sU3ltLnBsb3QuY3V0PC1nZ3Bsb3QoVFAxX1RvbFN5bS5zdW0sIGFlcyh4PVNpdGUsIHk9U3ltLnByb3AsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1TeW0ucHJvcC1zZSwgeW1heD1TeW0ucHJvcCtzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrDQogIGxhYnMoeD0iIiwgeT0iU3ltYmlvbnQgUmV0ZW50aW9uIiwgY29sb3VyPSJPcmlnaW4iKSsNCiAgeWxpbSgwLjIsIDEpKw0KICBhbm5vdGF0ZSgidGV4dCIsIHg9MSwgeT0wLjc1LCBsYWJlbD0iKiIsIHNpemU9c2lnLnN6LCBmb250ZmFjZT0iYm9sZCIpDQoNClRQMl9Ub2xTeW0ucGxvdC5jdXQ8LWdncGxvdChUUDJfVG9sU3ltLnN1bSwgYWVzKHg9U2l0ZSwgeT1TeW0ucHJvcCwgY29sb3VyPVNpdGUuT3JpZykpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPVN5bS5wcm9wLXNlLCB5bWF4PVN5bS5wcm9wK3NlKSwgd2lkdGg9Y2FwLnN6LCBsaW5ld2lkdGg9YmFyLnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSArDQogIGdlb21fcG9pbnQoc2l6ZT1wb2ludC5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIA0KICAgICAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiKSsNCiAgbGFicyh4PSIiLCB5PSIiLCBjb2xvdXI9Ik9yaWdpbiIpKw0KICB5bGltKDAuMiwgMSkNCg0KVFAzX1RvbFN5bS5wbG90LmN1dDwtZ2dwbG90KFRQM19Ub2xTeW0uc3VtLCBhZXMoeD1TaXRlLCB5PVN5bS5wcm9wLCBjb2xvdXI9U2l0ZS5PcmlnKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9T3JpZy5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49U3ltLnByb3Atc2UsIHltYXg9U3ltLnByb3Arc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KICBsYWJzKHg9IiIsIHk9IiIsIGNvbG91cj0iT3JpZ2luIikrDQogIHlsaW0oMC4yLCAxKQ0KDQpUUDRfVG9sU3ltLnBsb3QuY3V0PC1nZ3Bsb3QoVFA0X1RvbFN5bS5zdW0sIGFlcyh4PVNpdGUsIHk9U3ltLnByb3AsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1TeW0ucHJvcC1zZSwgeW1heD1TeW0ucHJvcCtzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnR4dC5zeiksIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1sZWcudGl0bGUuc3opLCANCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIikpKw0KICBsYWJzKHg9IiIsIHk9IiIsIGNvbG91cj0iT3JpZ2luIikrDQogIHlsaW0oMC4yLCAxKQ0KDQoNCiMjQ2hsb3JvcGh5bGwNClRQMV9Ub2xDaGwucGxvdC5jdXQ8LWdncGxvdChUUDFfVG9sQ2hsLnN1bSwgYWVzKHg9U2l0ZSwgeT1DaGwucHJvcCwgY29sb3VyPVNpdGUuT3JpZykpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUNobC5wcm9wLXNlLCB5bWF4PUNobC5wcm9wK3NlKSwgd2lkdGg9Y2FwLnN6LCBsaW5ld2lkdGg9YmFyLnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSArDQogIGdlb21fcG9pbnQoc2l6ZT1wb2ludC5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIA0KICAgICAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiKSsNCiAgbGFicyh4PSJTaXRlIGFuZCBPcmlnaW4iLCB5PSJDaGxvcm9waHlsbCBSZXRlbnRpb24iLCBjb2xvdXI9Ik9yaWdpbiIpKw0KICB5bGltKDAsIC44KQ0KDQpUUDJfVG9sQ2hsLnBsb3QuY3V0PC1nZ3Bsb3QoVFAyX1RvbENobC5zdW0sIGFlcyh4PVNpdGUsIHk9Q2hsLnByb3AsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1DaGwucHJvcC1zZSwgeW1heD1DaGwucHJvcCtzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrDQogIGxhYnMoeD0iU2l0ZSBhbmQgT3JpZ2luIiwgeT0iIiwgY29sb3VyPSJPcmlnaW4iKSsNCiAgeWxpbSgwLCAuOCkNCg0KVFAzX1RvbENobC5wbG90LmN1dDwtZ2dwbG90KFRQM19Ub2xDaGwuc3VtLCBhZXMoeD1TaXRlLCB5PUNobC5wcm9wLCBjb2xvdXI9U2l0ZS5PcmlnKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9T3JpZy5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49Q2hsLnByb3Atc2UsIHltYXg9Q2hsLnByb3Arc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KICBsYWJzKHg9IlNpdGUgYW5kIE9yaWdpbiIsIHk9IiIsIGNvbG91cj0iT3JpZ2luIikrDQogIHlsaW0oMCwgLjgpDQoNClRQNF9Ub2xDaGwucGxvdC5jdXQ8LWdncGxvdChUUDRfVG9sQ2hsLnN1bSwgYWVzKHg9U2l0ZSwgeT1DaGwucHJvcCwgY29sb3VyPVNpdGUuT3JpZykpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUNobC5wcm9wLXNlLCB5bWF4PUNobC5wcm9wK3NlKSwgd2lkdGg9Y2FwLnN6LCBsaW5ld2lkdGg9YmFyLnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSArDQogIGdlb21fcG9pbnQoc2l6ZT1wb2ludC5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIA0KICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT1sZWcudHh0LnN6KSwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPWxlZy50aXRsZS5zeiksIA0KICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiYmxhY2siKSkrDQogIGxhYnMoeD0iU2l0ZSBhbmQgT3JpZ2luIiwgeT0iIiwgY29sb3VyPSJPcmlnaW4iKSsNCiAgeWxpbSgwLCAuOCkNCg0KYGBgDQoNCg0KIyMjIyBGaWd1cmUgUzUNCmBgYHtyfQ0KIyNDcmVhdGUgUGFuZWwNClRvbF9maWc8LXBsb3RfZ3JpZCgNCiAgVFAxX1RvbFBBTS5wbG90LmN1dCxUUDJfVG9sUEFNLnBsb3QuY3V0LFRQM19Ub2xQQU0ucGxvdC5jdXQsVFA0X1RvbFBBTS5wbG90LmN1dCwNCiAgVFAxX1RvbFN5bS5wbG90LmN1dCxUUDJfVG9sU3ltLnBsb3QuY3V0LFRQM19Ub2xTeW0ucGxvdC5jdXQsVFA0X1RvbFN5bS5wbG90LmN1dCwNCiAgVFAxX1RvbENobC5wbG90LmN1dCxUUDJfVG9sQ2hsLnBsb3QuY3V0LFRQM19Ub2xDaGwucGxvdC5jdXQsVFA0X1RvbENobC5wbG90LmN1dCwNCiAgICAgICAgICAgICAgICAgICAgcmVsX3dpZHRocz1jKHJlcChjKDAuNywgMC43LCAwLjcsMSksMykpLCANCiAgICAgICAgICAgICAgICAgICAgcmVsX2hlaWdodHMgPSBjKDEsMC44NSwwLjg1KSwNCiAgICAgICAgICAgICAgICAgICAgbnJvdz0zLCBuY29sPTQsIGJ5cm93PVQsIGxhYmVscyA9IE5VTEwpDQoNCiMjU2F2ZSBGaWd1cmUNCmdnc2F2ZShmaWxlbmFtZT0iRmlndXJlcy8wM19QZXJmb3JtYW5jZS9GaWdTNV9Ub2xlcmFuY2VNZXRyaWNzLnBuZyIsIHBsb3Q9VG9sX2ZpZywgZHBpPTMwMCwgd2lkdGg9MTIsIGhlaWdodD0xMCwgdW5pdHM9ImluIikNCg0KYGBgDQoNCg0KIyBUYWJsZXMNCg0KIyMjIFRhYmxlIFM1DQoNCmBgYHtyfQ0KIyNEYXRhZnJhbWUgb2YgUGVyZm9ybWFuY2UgUmVzdWx0cyANCiMjTW9kZWwgUmVzdWx0cw0KVGFibGVTNTwtZGF0YS5mcmFtZShyYmluZCgNCiAgIHN1bW1hcnkoVExFLmxtZSkkY29lZmZpY2llbnRzWy0xLF0sc3VtbWFyeShUTEUubG1lX0tMKSRjb2VmZmljaWVudHNbLTEsXSwNCiAgIHN1bW1hcnkoVExFLmxtZV9TUykkY29lZmZpY2llbnRzWy0xLF0sDQogICANCiAgIHN1bW1hcnkoVG9sX1BBTS5sbWVfVFAxKSRjb2VmZmljaWVudHNbLTEsXSxzdW1tYXJ5KFRvbF9QQU0ubG1lX1RQMV9LTCkkY29lZmZpY2llbnRzWy0xLF0sDQogICBzdW1tYXJ5KFRvbF9QQU0ubG1lX1RQMV9TUykkY29lZmZpY2llbnRzWy0xLF0sDQogICBzdW1tYXJ5KFRvbF9TeW0ubG1lX1RQMSkkY29lZmZpY2llbnRzWy0xLF0sc3VtbWFyeShUb2xfU3ltLmxtZV9UUDFfS0wpJGNvZWZmaWNpZW50c1stMSxdLA0KICAgc3VtbWFyeShUb2xfU3ltLmxtZV9UUDFfU1MpJGNvZWZmaWNpZW50c1stMSxdLCANCiAgIHN1bW1hcnkoVG9sX0NobC5sbWVfVFAxKSRjb2VmZmljaWVudHNbLTEsXSxzdW1tYXJ5KFRvbF9DaGwubG1lX1RQMV9LTCkkY29lZmZpY2llbnRzWy0xLF0sDQogICBzdW1tYXJ5KFRvbF9DaGwubG1lX1RQMV9TUykkY29lZmZpY2llbnRzWy0xLF0sIA0KICAgDQogICAgc3VtbWFyeShUb2xfUEFNLmxtZV9UUDIpJGNvZWZmaWNpZW50c1stMSxdLHN1bW1hcnkoVG9sX1BBTS5sbWVfVFAyX0tMKSRjb2VmZmljaWVudHNbLTEsXSwNCiAgIHN1bW1hcnkoVG9sX1BBTS5sbWVfVFAyX1NTKSRjb2VmZmljaWVudHNbLTEsXSwNCiAgIHN1bW1hcnkoVG9sX1N5bS5sbWVfVFAyKSRjb2VmZmljaWVudHNbLTEsXSxzdW1tYXJ5KFRvbF9TeW0ubG1lX1RQMl9LTCkkY29lZmZpY2llbnRzWy0xLF0sDQogICBzdW1tYXJ5KFRvbF9TeW0ubG1lX1RQMl9TUykkY29lZmZpY2llbnRzWy0xLF0sIA0KICAgc3VtbWFyeShUb2xfQ2hsLmxtZV9UUDIpJGNvZWZmaWNpZW50c1stMSxdLHN1bW1hcnkoVG9sX0NobC5sbWVfVFAyX0tMKSRjb2VmZmljaWVudHNbLTEsXSwNCiAgIHN1bW1hcnkoVG9sX0NobC5sbWVfVFAyX1NTKSRjb2VmZmljaWVudHNbLTEsXSwgDQogICANCiAgICAgIHN1bW1hcnkoVG9sX1BBTS5sbWVfVFAzKSRjb2VmZmljaWVudHNbLTEsXSxzdW1tYXJ5KFRvbF9QQU0ubG1lX1RQM19LTCkkY29lZmZpY2llbnRzWy0xLF0sDQogICBzdW1tYXJ5KFRvbF9QQU0ubG1lX1RQM19TUykkY29lZmZpY2llbnRzWy0xLF0sDQogICBzdW1tYXJ5KFRvbF9TeW0ubG1lX1RQMykkY29lZmZpY2llbnRzWy0xLF0sc3VtbWFyeShUb2xfU3ltLmxtZV9UUDNfS0wpJGNvZWZmaWNpZW50c1stMSxdLA0KICAgc3VtbWFyeShUb2xfU3ltLmxtZV9UUDNfU1MpJGNvZWZmaWNpZW50c1stMSxdLCANCiAgIHN1bW1hcnkoVG9sX0NobC5sbWVfVFAzKSRjb2VmZmljaWVudHNbLTEsXSxzdW1tYXJ5KFRvbF9DaGwubG1lX1RQM19LTCkkY29lZmZpY2llbnRzWy0xLF0sDQogICBzdW1tYXJ5KFRvbF9DaGwubG1lX1RQM19TUykkY29lZmZpY2llbnRzWy0xLF0sIA0KICAgDQogICAgICBzdW1tYXJ5KFRvbF9QQU0ubG1lX1RQNCkkY29lZmZpY2llbnRzWy0xLF0sc3VtbWFyeShUb2xfUEFNLmxtZV9UUDRfS0wpJGNvZWZmaWNpZW50c1stMSxdLA0KICAgc3VtbWFyeShUb2xfUEFNLmxtZV9UUDRfU1MpJGNvZWZmaWNpZW50c1stMSxdLA0KICAgc3VtbWFyeShUb2xfU3ltLmxtZV9UUDQpJGNvZWZmaWNpZW50c1stMSxdLHN1bW1hcnkoVG9sX1N5bS5sbWVfVFA0X0tMKSRjb2VmZmljaWVudHNbLTEsXSwNCiAgIHN1bW1hcnkoVG9sX1N5bS5sbWVfVFA0X1NTKSRjb2VmZmljaWVudHNbLTEsXSwgDQogICBzdW1tYXJ5KFRvbF9DaGwubG1lX1RQNCkkY29lZmZpY2llbnRzWy0xLF0sc3VtbWFyeShUb2xfQ2hsLmxtZV9UUDRfS0wpJGNvZWZmaWNpZW50c1stMSxdLA0KICAgc3VtbWFyeShUb2xfQ2hsLmxtZV9UUDRfU1MpJGNvZWZmaWNpZW50c1stMSxdKSkNCg0KbmFtZXMoVGFibGVTNSk8LWMoIkVzdGltYXRlIiwgIlNFIiwgIkRGIiwgInQiLCAicCIpIA0KDQojI01ldGFkYXRhIA0KVGFibGVTNSRUeXBlPC1jKHJlcCgiR3Jvd3RoIiwgNSksIHJlcCgiVG9sZXJhbmNlIiwgNjApKQ0KVGFibGVTNSRNZXRyaWM8LWMocmVwKCJHcm93dGgiLCA1KSwgcmVwKGMocmVwKCJGdkZtIiwgNSksIHJlcCgiU3ltYmlvbnRzIiwgNSksIHJlcCgiQ2hsb3JvcGh5bGwiLCA1KSksIDQpKQ0KVGFibGVTNSRUaW1lUDwtYyhyZXAoIlRQMS4yIiwgNSksIHJlcCgiVFAxIiwxNSksIHJlcCgiVFAyIiwxNSksIHJlcCgiVFAzIiwxNSksIHJlcCgiVFA0IiwxNSkpDQpUYWJsZVM1JFByZWRpY3RvcjwtYyhyZXAoYygiT3JpZ2luIiwgIlNpdGUiLCAiT3JpZ2luIHggU2l0ZSIsICJLTCBPcmlnaW4iLCAiU1MgT3JpZ2luIiksIDEzKSkNCg0KIyNFZmZlY3QgU2l6ZSAgDQpUYWJsZVM1JEV0YVNxPC1jKA0KICBldGFfc3F1YXJlZChUTEUubG1lKSRFdGEyX3BhcnRpYWwsZXRhX3NxdWFyZWQoVExFLmxtZV9LTCkkRXRhMl9wYXJ0aWFsLA0KICAgZXRhX3NxdWFyZWQoVExFLmxtZV9TUykkRXRhMl9wYXJ0aWFsLA0KICAgDQogICBldGFfc3F1YXJlZChUb2xfUEFNLmxtZV9UUDEpJEV0YTJfcGFydGlhbCxldGFfc3F1YXJlZChUb2xfUEFNLmxtZV9UUDFfS0wpJEV0YTJfcGFydGlhbCwNCiAgIGV0YV9zcXVhcmVkKFRvbF9QQU0ubG1lX1RQMV9TUykkRXRhMl9wYXJ0aWFsLA0KICAgZXRhX3NxdWFyZWQoVG9sX1N5bS5sbWVfVFAxKSRFdGEyX3BhcnRpYWwsZXRhX3NxdWFyZWQoVG9sX1N5bS5sbWVfVFAxX0tMKSRFdGEyX3BhcnRpYWwsDQogICBldGFfc3F1YXJlZChUb2xfU3ltLmxtZV9UUDFfU1MpJEV0YTJfcGFydGlhbCwgDQogICBldGFfc3F1YXJlZChUb2xfQ2hsLmxtZV9UUDEpJEV0YTJfcGFydGlhbCxldGFfc3F1YXJlZChUb2xfQ2hsLmxtZV9UUDFfS0wpJEV0YTJfcGFydGlhbCwNCiAgIGV0YV9zcXVhcmVkKFRvbF9DaGwubG1lX1RQMV9TUykkRXRhMl9wYXJ0aWFsLCANCiAgIA0KICAgIGV0YV9zcXVhcmVkKFRvbF9QQU0ubG1lX1RQMikkRXRhMl9wYXJ0aWFsLGV0YV9zcXVhcmVkKFRvbF9QQU0ubG1lX1RQMl9LTCkkRXRhMl9wYXJ0aWFsLA0KICAgZXRhX3NxdWFyZWQoVG9sX1BBTS5sbWVfVFAyX1NTKSRFdGEyX3BhcnRpYWwsDQogICBldGFfc3F1YXJlZChUb2xfU3ltLmxtZV9UUDIpJEV0YTJfcGFydGlhbCxldGFfc3F1YXJlZChUb2xfU3ltLmxtZV9UUDJfS0wpJEV0YTJfcGFydGlhbCwNCiAgIGV0YV9zcXVhcmVkKFRvbF9TeW0ubG1lX1RQMl9TUykkRXRhMl9wYXJ0aWFsLCANCiAgIGV0YV9zcXVhcmVkKFRvbF9DaGwubG1lX1RQMikkRXRhMl9wYXJ0aWFsLGV0YV9zcXVhcmVkKFRvbF9DaGwubG1lX1RQMl9LTCkkRXRhMl9wYXJ0aWFsLA0KICAgZXRhX3NxdWFyZWQoVG9sX0NobC5sbWVfVFAyX1NTKSRFdGEyX3BhcnRpYWwsIA0KICAgDQogICAgICBldGFfc3F1YXJlZChUb2xfUEFNLmxtZV9UUDMpJEV0YTJfcGFydGlhbCxldGFfc3F1YXJlZChUb2xfUEFNLmxtZV9UUDNfS0wpJEV0YTJfcGFydGlhbCwNCiAgIGV0YV9zcXVhcmVkKFRvbF9QQU0ubG1lX1RQM19TUykkRXRhMl9wYXJ0aWFsLA0KICAgZXRhX3NxdWFyZWQoVG9sX1N5bS5sbWVfVFAzKSRFdGEyX3BhcnRpYWwsZXRhX3NxdWFyZWQoVG9sX1N5bS5sbWVfVFAzX0tMKSRFdGEyX3BhcnRpYWwsDQogICBldGFfc3F1YXJlZChUb2xfU3ltLmxtZV9UUDNfU1MpJEV0YTJfcGFydGlhbCwgDQogICBldGFfc3F1YXJlZChUb2xfQ2hsLmxtZV9UUDMpJEV0YTJfcGFydGlhbCxldGFfc3F1YXJlZChUb2xfQ2hsLmxtZV9UUDNfS0wpJEV0YTJfcGFydGlhbCwNCiAgIGV0YV9zcXVhcmVkKFRvbF9DaGwubG1lX1RQM19TUykkRXRhMl9wYXJ0aWFsLCANCiAgIA0KICAgICAgZXRhX3NxdWFyZWQoVG9sX1BBTS5sbWVfVFA0KSRFdGEyX3BhcnRpYWwsZXRhX3NxdWFyZWQoVG9sX1BBTS5sbWVfVFA0X0tMKSRFdGEyX3BhcnRpYWwsDQogICBldGFfc3F1YXJlZChUb2xfUEFNLmxtZV9UUDRfU1MpJEV0YTJfcGFydGlhbCwNCiAgIGV0YV9zcXVhcmVkKFRvbF9TeW0ubG1lX1RQNCkkRXRhMl9wYXJ0aWFsLGV0YV9zcXVhcmVkKFRvbF9TeW0ubG1lX1RQNF9LTCkkRXRhMl9wYXJ0aWFsLA0KICAgZXRhX3NxdWFyZWQoVG9sX1N5bS5sbWVfVFA0X1NTKSRFdGEyX3BhcnRpYWwsIA0KICAgZXRhX3NxdWFyZWQoVG9sX0NobC5sbWVfVFA0KSRFdGEyX3BhcnRpYWwsZXRhX3NxdWFyZWQoVG9sX0NobC5sbWVfVFA0X0tMKSRFdGEyX3BhcnRpYWwsDQogICBldGFfc3F1YXJlZChUb2xfQ2hsLmxtZV9UUDRfU1MpJEV0YTJfcGFydGlhbCkNCg0KVGFibGVTNTwtVGFibGVTNVssYyg2OjksIDE6NSwgMTApXQ0KDQpyb3duYW1lcyhUYWJsZVM1KTwtTlVMTA0KDQojI1NhdmUgVGFibGUNCndyaXRlLmNzdihUYWJsZVM1LCAiT3V0cHV0cy9UYWJsZVM1LmNzdiIsIHJvdy5uYW1lcz1GQUxTRSkNCg0KYGBgDQoNCg0KIyMjIFRhYmxlIFM2DQpgYGB7cn0NCiMjRGF0YWZyYW1lIG9mIEluaXRpYWwgVGhlcm1hbCBUb2xlcmFuY2UgQXNzYXkgUmVzdWx0cyANCiMjTW9kZWwgUmVzdWx0cw0KVGFibGVTNi5tb2RlbDwtZGF0YS5mcmFtZShyYmluZCgNCiAgc3VtbWFyeShQQU0ubG1lX0lOKSRjb2VmZmljaWVudHNbLTEsXSwgc3VtbWFyeShTeW0ubG1lX0lOKSRjb2VmZmljaWVudHNbLTEsXSwgc3VtbWFyeShDaGwubG1lX0lOKSRjb2VmZmljaWVudHNbLTEsXSkpDQoNCm5hbWVzKFRhYmxlUzYubW9kZWwpPC1jKCJFc3RpbWF0ZSIsICJTRSIsICJERiIsICJ0IiwgInAiKSANCg0KVGFibGVTNi5lbW1lYW5zPC1kYXRhLmZyYW1lKHJiaW5kKA0KZGF0YS5mcmFtZShyYmluZChlbW1lYW5zKFBBTS5sbWVfSU4sIHBhaXJ3aXNlIH4gU2l0ZSB8IFRyZWF0bWVudCkkY29udHJhc3RzWzFdLCBlbW1lYW5zKFBBTS5sbWVfSU4sIHBhaXJ3aXNlIH4gU2l0ZSB8IFRyZWF0bWVudCkkY29udHJhc3RzWzJdLCBlbW1lYW5zKFBBTS5sbWVfSU4sIHBhaXJ3aXNlIH4gVHJlYXRtZW50IHwgU2l0ZSkkY29udHJhc3RzWzFdLCBlbW1lYW5zKFBBTS5sbWVfSU4sIHBhaXJ3aXNlIH4gVHJlYXRtZW50IHwgU2l0ZSkkY29udHJhc3RzWzJdKSlbLC1jKDE6MyldLCANCmRhdGEuZnJhbWUocmJpbmQoZW1tZWFucyhTeW0ubG1lX0lOLCBwYWlyd2lzZSB+IFNpdGUgfCBUcmVhdG1lbnQpJGNvbnRyYXN0c1sxXSwgZW1tZWFucyhTeW0ubG1lX0lOLCBwYWlyd2lzZSB+IFNpdGUgfCBUcmVhdG1lbnQpJGNvbnRyYXN0c1syXSwgZW1tZWFucyhTeW0ubG1lX0lOLCBwYWlyd2lzZSB+IFRyZWF0bWVudCB8IFNpdGUpJGNvbnRyYXN0c1sxXSwgZW1tZWFucyhTeW0ubG1lX0lOLCBwYWlyd2lzZSB+IFRyZWF0bWVudCB8IFNpdGUpJGNvbnRyYXN0c1syXSkpWywtYygxOjMpXSwNCmRhdGEuZnJhbWUocmJpbmQoZW1tZWFucyhDaGwubG1lX0lOLCBwYWlyd2lzZSB+IFNpdGUgfCBUcmVhdG1lbnQpJGNvbnRyYXN0c1sxXSwgZW1tZWFucyhDaGwubG1lX0lOLCBwYWlyd2lzZSB+IFNpdGUgfCBUcmVhdG1lbnQpJGNvbnRyYXN0c1syXSwgZW1tZWFucyhDaGwubG1lX0lOLCBwYWlyd2lzZSB+IFRyZWF0bWVudCB8IFNpdGUpJGNvbnRyYXN0c1sxXSwgZW1tZWFucyhDaGwubG1lX0lOLCBwYWlyd2lzZSB+IFRyZWF0bWVudCB8IFNpdGUpJGNvbnRyYXN0c1syXSkpWywtYygxOjMpXSkpDQoNCm5hbWVzKFRhYmxlUzYuZW1tZWFucyk8LWMoIkVzdGltYXRlIiwgIlNFIiwgIkRGIiwgInQiLCAicCIpIA0KDQpUYWJsZVM2PC1yYmluZChUYWJsZVM2Lm1vZGVsWzE6MyxdLCBUYWJsZVM2LmVtbWVhbnNbMTo0LF0sIFRhYmxlUzYubW9kZWxbNDo2LF0sIFRhYmxlUzYuZW1tZWFuc1s1OjgsXSwgVGFibGVTNi5tb2RlbFs3OjksXSwgVGFibGVTNi5lbW1lYW5zWzk6MTIsXSkNCg0KIyNNZXRhZGF0YSANClRhYmxlUzYkTWV0cmljPC1jKHJlcCgiRnZGbSIsIDcpLCByZXAoIlN5bWJpb250cyIsIDcpLCByZXAoIkNobG9yb3BoeWxsIiwgNykpDQpUYWJsZVM2JFByZWRpY3RvcjwtYyhyZXAoYygiU2l0ZSIsICJUcmVhdG1lbnQiLCAiU2l0ZSB4IFRyZWF0bWVudCIsICJDb250cm9sIFNpdGUiLCAiSGVhdGVkIFNpdGUiLCAiS0wgVHJlYXRtZW50IiwgIlNTIFRyZWF0bWVudCIpLCAzKSkNCg0KDQojI0VmZmVjdCBTaXplICANClRhYmxlUzYkRXRhU3E8LWMoZXRhX3NxdWFyZWQoUEFNLmxtZV9JTikkRXRhMl9wYXJ0aWFsLCBOQSwgTkEsIE5BLCBOQSwgZXRhX3NxdWFyZWQoU3ltLmxtZV9JTikkRXRhMl9wYXJ0aWFsLCBOQSwgTkEsIE5BLCBOQSwgZXRhX3NxdWFyZWQoQ2hsLmxtZV9JTikkRXRhMl9wYXJ0aWFsLCBOQSwgTkEsIE5BLCBOQSkNCg0KVGFibGVTNjwtVGFibGVTNlssYyg2OjcsIDE6NSwgOCldDQoNCnJvd25hbWVzKFRhYmxlUzYpPC1OVUxMDQoNCiMjU2F2ZSBUYWJsZQ0Kd3JpdGUuY3N2KFRhYmxlUzYsICJPdXRwdXRzL1RhYmxlUzYuY3N2Iiwgcm93Lm5hbWVzPUZBTFNFKQ0KICANCmBgYA0KDQo=